2013-02-14 28 views
1

我真的无法做到这一点,所以我会很感激任何提示。我必须在这里犯一些错误(4.1.2)。Android:ListView,同时在旋转/配置更改后记住并忘记它的getCheckedItemPosition

我有一个Activity其中,在onCreate(),建立一个子类ArrayAdapterListView项目,其呈现为CheckableViewGroup

Activity已经利用NonConfiguration机制在定位更改时重新构建适配器。但是,它目前不存储ListViewgetCheckedItemPosition(),因为我觉得它不应该是必要的(详情如下)。

有趣的是,我正在观察的是以下内容。

  • 活动已呈现。
  • 用户检查一个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(); 
    } 
} 

回答

0

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

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

时间是关键在这里。

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

所以解决方案很简单:在onResume()中执行任何评估逻辑。