我真的无法弥补,所以我会感谢任何提示。我必须在这里犯一些错误(4.1.2)。
我有一个which Activity, in为呈现为.onCreate()ArrayAdapterListViewCheckable ViewGroup
Activity已经利用一种机制在NonConfiguration方向更改时重新构建适配器。但是,它目前没有存储ListView's getCheckedItemPosition(),因为我觉得它不应该是必要的(详情如下)。
有趣的是,我观察到的是以下内容。
- 活动被渲染。
- 用户检查 ListView 项目。
- ListView 项目以选中状态显示。
onItemClickListener调用andgetCheckedItemPosition()得到正确的ListView结果。- 用户改变屏幕方向。
onCreate()重新构建“ListView”并像之前一样显示(之后onCreate();见下文)。onCreate()尽管显示了正确检查的项目,但仍会调用getCheckedItemPosition()并获取-1ListView
经过进一步检查,出现以下细节。
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();
}
}