2013-02-14 29 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()中執行任何評估邏輯。