1

私のアプリは現在Android1.6を対象としています。これには、 CHOICE_MODE_SINGLEを含むListViewが含まれています。すべてのアイテムはCheckableを実装しています。setItemChecked (int position、boolean value)を使用して、必要に応じてアイテムをチェック/チェック解除しています。Android 2.1、2.2、2.3で期待どおりに動作します。ただし、Android 1.6では、アイテムはチェックされません。

コードは次のようになります。

Integer checkedIndex = 0; // This is actually set from somewhere else.

void updateCheckedItem() {
  int count = adapter.getCount();
  for (int i = 0; i < count; i++) {
    listView.setItemChecked(i, isChecked(i));
  }

  // Here, we should have a checked item (unless checkedIndex was null)
  SparseBooleanArray checkedPositions = listView.getCheckedItemPositions();
  int size = checkedPositions.size();
  // On Android 1.6, size is 0 (wrong)
  // On Android 2.x, size is 1 (correct)

  // Another try...
  int checkedPosition = listView.getCheckedItemPosition();
  // On Android 1.6, checkedPosition is INVALID_POSITION (-1), meaning nothing is checked (wrong)
  // On Android 2.x, checkedPosition is whatever checkedIndex is (correct)
}

boolean isChecked(int position) {
  return checkedIndex != null && checkedIndex == position;
}

この質問は、ListViewのChoideModeをXMLではなくコードで設定することで問題を解決しました。私はそもそもそれをコードで行い、それをXMLに入れても何の違いもありませんでした。それでも問題は発生します。

これをAndroid1.6で機能させるにはどうすればよいですか?

4

2 に答える 2

2

問題が見つかりました。1.6 と 2.1 の間で setItemChecked() に変更がありました。

1.6 では、setItemChecked() が false の値で呼び出されると、常にチェック済みの項目がクリアされていました。したがって、最後の項目がチェックされた項目でない限り、最終的には配列がクリアされるため、チェックされた項目はありません。

チェックされた項目に対して setItemChecked を呼び出すだけで回避できます。他の項目のチェックを外すことは、(明らかに) ListView によって処理されます。チェックする項目がない (checkedIndex が null) 場合は、clearChoices()を使用して何もチェックしないようにする必要があります。これは、チェックされたアイテムがリストから削除され、別のアイテムがその位置を占める場合に役立ちます。選択をクリアしないと、checkedIndex が null であっても、ListView はその位置をチェックします。

void updateCheckedItem() {
  if (checkedIndex != null) {
    listView.setItemChecked(selected, true);
  } else {
    listView.clearChoices();
  }
}
于 2011-10-20T08:39:23.333 に答える
0

1 つの問題はgetCheckedItemPositions()にある可能性があります

それは言います:

リスト内のチェックされた項目のセットを返します。結果は、選択モードが CHOICE_MODE_NONE に設定されていない場合にのみ有効です。

そのため、アイテムのクリック リストナーを使用して、チェックされたアイテムの ID/位置を取得することをお勧めします。

于 2011-10-20T08:02:32.560 に答える