web-dev-qa-db-ja.com

onItemSelectedListenerがListViewで呼び出されないのはなぜですか?

私は次のように設定されているListViewを使用しています:

<ListView Android:id="@Android:id/list" Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" Android:longClickable="false"
    Android:choiceMode="singleChoice">
</ListView>

私のコードでは、次のようにOnItemSelectedListenerをListViewに追加します。

getListView().setAdapter(adapter);
getListView().setOnItemSelectedListener(this);

私のアクティビティはそのようなリスナーを実装します:

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    Log.d("Tag", "ListItemSelected: Parent: " + parent.toString() + " View: "
            + view.toString() + " Position: " + " Id: " + id);
}

リスト内の何かをクリックすると、このデバッグ出力が表示されることを期待していました。ただし、デバッグ出力はLogCatに表示されません。

56
Janusz

OnItemSelectedListener は、リストアイテムのクリックではなく、リストアイテムの選択をリッスンします。

この場合の選択は、デバイスのトラックパッドでこのアイテムにフォーカスを移動することと見なすことができます。

目的の動作を得るには、 OnItemClickListener を使用する必要があります。

98
Janusz

それは、タッチ対応デバイスで指を使ってテストしているからです。 タッチモード では、フォーカスも選択もありません。選択が必要なUIでは、ラジオボタンなどの異なるタイプのウィジェットを使用する必要があります。

3
Edward Brey

最初に、ChoiceModeを設定する必要があります。次に、ListViewでsetOnItemSelectedListenerAdapterViewに登録されているため、選択したイベントを受け入れません。 、およびメソッドhandleDataChanged()のコールバック、ただしクラスAbsListViewはこのメソッドをオーバーライドし、OnItemSelectedListenerをコールバックしない

enter image description here

setOnItemClickListenerのこのメソッドでseletedItemを取得できます

     mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Log.e("TAG", "onItemClick: " + position);
            SparseBooleanArray positions = mListView.getCheckedItemPositions();
            Log.e("TAG", "onItemSelected: " + positions.toString());

        }
    });
2
joe