4

1つまたは複数のアイテムを選択することに関連するListViewの内部機能をよりよく理解しようとしています.実際、ここまで理解するのがどれほど難しいかは驚くべきことです.

デフォルトでは、ListView アイテムを定期的にクリックすると、そのアイテムの「チェック済み」状態が true に設定されます。この動作をオーバーライドして、この選択が行われないようにするにはどうすればよいですか?

さらに基本的なことですが、ここで基になる ListView の仕組みは何ですか? 行ビューのデフォルトの onClick は、次に ListView の onItemClick/LongClick ハンドラを呼び出しますか、またはこのクリック処理はどのように順序付けされますか?

複数チョイスのchoiceModeを許可したいのですが、onItemLongClickで選択したいだけです。onItemClick をオーバーライドしてもこの動作は変わらず、アダプタの getView() 関数で行ビューの onClick ハンドラをオーバーライドすると、ListView の onItemClick と onItemLongClick が発生しなくなるようです。

以下は、私のアプリケーションのより詳細なコンテキストです


私の目標は、次のように機能する ListView を ListActivity に表示させることです。

  • アイテムをクリックすると、非選択アクションが実行されます (行を展開して詳細情報を表示します)
  • アイテムを長押しすると、そのアイテムが選択されます。項目を選択すると、行の背景が強調表示されます (Gmail アプリの場合と同様)。
  • 複数の項目を選択できます

私のアプリケーション構造は次のとおりです。

  • Activity は ListActivity の拡張です
  • Adapter は ArrayAdapter<> の拡張です
  • ListView 行レイアウトは完全にカスタム レイアウトです (組み込みの ListView 行レイアウトではありません)。

ListView の組み込み機能を理解することで、現在の状況にたどり着きました。

  • choiceMode を multipleChoice に設定する
  • ListView の「チェック済み」機能を使用して選択を行い、追跡する
  • カスタムセレクターを「activatedBackgroundIndicator」として使用して強調表示を表示します(例はこちら
4

1 に答える 1

1

ArrayList を保持して、ListView 項目の選択位置を維持します。ListView アイテムが選択されている場合、その ArrayList で、アイテムの位置が ArrayList 内にあるかどうかを確認します。item が ArrayList にない場合は、Item の状態をチェック済みに変更します。それ以外の場合は、状態をチェックなしに変更し、位置オブジェクトを ArrayList から削除します。これは私にとってはうまくいきました。

于 2013-10-01T07:20:54.947 に答える