我真的无法弥补,所以如果有任何提示,我将不胜感激。我必须在这里犯一些错误(4.1.2)。
我有一个 Activity
,它在 onCreate()
中为 ListView
项目设置了一个子类 ArrayAdapter
它呈现为 Checkable
ViewGroup
。
Activity
已经利用 NonConfiguration
机制在方向改变时重新构建适配器。但是,它目前没有存储 ListView
的 getCheckedItemPosition()
,因为我觉得它没有必要(详情如下)。
有趣的是,我观察到的是以下内容。
- Activity 已呈现。
- 用户检查 ListView 项。
- ListView 项目显示为选中状态。
onItemClickListener
为ListView
调用getCheckedItemPosition()
并获得正确的结果。- 用户更改屏幕方向。
onCreate()
重新构建“ListView”并像以前一样显示(在onCreate()
之后;见下文)。onCreate()
调用getCheckedItemPosition()
并获取-1
,尽管ListView
显示正确检查的项目
经过进一步检查,出现了以下细节。
onCreate()
:- 获取
ListView
资源 - 构建
MyAdapter
- 将
MyAdapter
设置为ListView
的适配器 getCheckedItemPosition()
返回-1
- 获取
- 在
onCreate()
之后:MyAdapter.getView()
正在被调用CheckableViewGroup.setChecked()
使用正确的checked
值调用- 将对所有项目重复最后两个步骤
如前所述,我依赖于 View
对象在分配了 ID 后保存其状态的 Android 功能。我会说是这种情况,因为必须有一些对象可以为所有列表条目设置正确的 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();
}
}
最佳答案
我在发布我的问题后进行了另一次测试,因为我在描述我的观察时有了一个想法。
的确,我的怀疑得到了证实。
时机是关键。
ListView
将在 onResume()
(但不是之前)中报告正确的 getCheckedItemPosition()
值。
因此解决方案很简单:在 onResume()
中执行任何评估逻辑。
关于Android:ListView,同时在旋转/配置更改后记住并忘记其getCheckedItemPosition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14875642/