我真的无法弥补,所以我会感谢任何提示。我必须在这里犯一些错误(4.1.2)。
我有一个which Activity
, in为呈现为.onCreate()
ArrayAdapter
ListView
Checkable
ViewGroup
Activity
已经利用一种机制在NonConfiguration
方向更改时重新构建适配器。但是,它目前没有存储ListView
's getCheckedItemPosition()
,因为我觉得它不应该是必要的(详情如下)。
有趣的是,我观察到的是以下内容。
- 活动被渲染。
- 用户检查 ListView 项目。
- ListView 项目以选中状态显示。
onItemClickListener
调用andgetCheckedItemPosition()
得到正确的ListView
结果。- 用户改变屏幕方向。
onCreate()
重新构建“ListView”并像之前一样显示(之后onCreate()
;见下文)。onCreate()
尽管显示了正确检查的项目,但仍会调用getCheckedItemPosition()
并获取-1
ListView
经过进一步检查,出现以下细节。
onCreate()
:- 获取
ListView
资源 - 建造
MyAdapter
- 设置
MyAdapter
为适配器ListView
getCheckedItemPosition()
返回-1
- 获取
- 之后
onCreate()
:MyAdapter.getView()
被调用CheckableViewGroup.setChecked()
用正确的checked
值调用- 将对所有项目重复最后两个步骤
如前所述,我依赖于 Android 功能,View
如果对象分配了 ID,则对象会保存其状态。我会说是这种情况,因为那里必须有一些对象checked
为所有列表条目设置正确的状态。(顺便说一句,CheckableViewGroup
也覆盖on{Save,Restore}InstanceState()
,但无论是否分配了 ID 都不会被调用(大概是因为它永远不会附加到布局根?)。
所以看起来好像ListView
既知道又不知道它的getCheckedItemPosition()
?还是我走错了路?
public final class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
itemList = (ListView)findViewById(R.id.ma_list);
listAdapter = new MyAdapter();
itemList.setAdapter(listAdapter);
itemList.setOnItemClickListener(
new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> av, View v, int pos, long id) { checkForm(); }
}
);
listAdapterSetup();
// this is where itemList.getCheckedItemPosition() returns -1
// when the listView has been re-built from NonConfiguration data:
checkForm();
}
}