2013年7月23日火曜日

[Android] CursorLoaderのロード後にListViewの選択行を変更

ListViewでadapterにSimpleCursorAdapterとCursorLoaderを使用している状況では、onLoadFinishedメソッドの中でadapter.swapCursor(cursor)を呼び出してListViewの中身を更新すると思います。
この時swapCursorの後にListViewの選択行を変更するには、以下のようにします。

adapter.swapCursor(cursor)
listView.post(new Runnable {
  def run() {
    val pos = 0 // 選択する行
    // listView.setItemChecked(pos, true)  //singleChoiceの時はこれも呼ぶ
    listView.setSelection(pos)
    listView.performItemClick(listView.getChildAt(pos), pos, 0)
  }
}

ポイントはswapCursorの後に直接listView.setSelectoin(pos)を呼ばずに、postメソッドを呼んでRunnable経由でsetSelectionを呼び出す点です。

なぜならデバッガで追うと分かりますが、swapCursorの時点ではまだListViewの描画が終わっていないため、setSelectionなどを呼んでも効果がないからです。

上記のようにするとListViewの描画後にrun()メソッドの中身が実行され、ListViewの選択行が正しく変更されます。

0 件のコメント:

コメントを投稿