2

我真的无法弥补,所以我会感谢任何提示。我必须在这里犯一些错误(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(); 
    }
}
4

1 回答 1

1

在我发布我的问题后,我正在做另一个测试,因为我在描述我的观察时得到了一个想法。

事实上,我的怀疑得到了证实。

时机在这里很关键。

将在(但不是之前)ListView报告正确的getCheckedItemPosition()值。onResume()

所以解决方案很简单:在onResume().

于 2013-02-14T13:28:12.943 回答