我真的无法做到这一点,所以我会很感激任何提示。我必须在这里犯一些错误(4.1.2)。Android:ListView,同时在旋转/配置更改后记住并忘记它的getCheckedItemPosition
我有一个Activity
其中,在onCreate()
,建立一个子类ArrayAdapter
为ListView
项目,其呈现为Checkable
ViewGroup
。
Activity
已经利用NonConfiguration
机制在定位更改时重新构建适配器。但是,它目前不存储ListView
的getCheckedItemPosition()
,因为我觉得它不应该是必要的(详情如下)。
有趣的是,我正在观察的是以下内容。
- 活动已呈现。
- 用户检查一个ListView项目。
- ListView项目以选中状态显示。
onItemClickListener
调用getCheckedItemPosition()
为ListView
并得到正确的结果。- 用户更改屏幕方向。
onCreate()
重新构建“ListView”,它会像以前一样显示(在onCreate()
之后;参见下文)。onCreate()
调用getCheckedItemPosition()
,并得到-1
尽管ListView
显示经过进一步研究,正确地将检查项目
,以下细节浮出水面。
onCreate()
:- 得到
ListView
资源 - 构建
MyAdapter
- 设置
MyAdapter
作为适配器ListView
getCheckedItemPosition()
回报-1
- 得到
- 后:
MyAdapter.getView()
被称为CheckableViewGroup.setChecked()
时调用正确的checked
值- 最后两个步骤将重复所有项目
正如之前所说的,我依靠Android功能View
对象保存其状态,如果他们有一个ID分配。我会说这是事实,因为必须有一些对象为所有列表条目设置正确的checked
状态。(顺便说一下,CheckableViewGroup
还覆盖但不会被称为无论它是否具有分配的(大概是因为它永远不会被附着到布局根的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();
}
}