为什么我的ListView中的onItemSelectedListener没有被调用?

57
我正在使用一个像这样设置的ListView:

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

在我的代码中,我像这样向ListView添加了一个OnItemSelectedListener:

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

我的Activity像这样实现了监听器:

@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中从未显示出来。

3个回答

108

OnItemSelectedListener 监听列表项的选择,而非列表项的点击。

在这种情况下,所谓的选择可以理解为使用设备的触摸板将焦点移动到该项上。

要获得所需的行为,必须使用OnItemClickListener


我实现了你的方法,但是出现了一些问题。列表选择器消失了。 - Debopam Mitra
尝试将以下属性添加到您的列表视图中:<ListView android:stackFromBottom="true" android:choiceMode="singleChoice" ... 这将使项目在选择后保持高亮显示,并且当您选择另一个项目时,先前的选择将消失。 - Sami EMAD
10
这看起来更像是一种权宜之计而不是修复。选择事件没有被触发。 - Diederik
看起来是这样的。我正在调用setSelection(),甚至这也不触发它。 :| - Hakanai

4

这是因为您正在使用触摸设备进行测试。在触摸模式下,没有焦点和选择。需要选择的用户界面应该使用不同类型的小部件,例如单选按钮。


实际上,被接受的答案是有效的,但这才是真正的原因。 - CristianoYL
感谢您链接到那篇博客文章。我从未想过在触摸屏上“选择”并不存在,或者更准确地说,在这种情况下,“选择”并不是我所认为的意思。 - LarsH
这里让人感到违反直觉的部分是,ListView 提供了“单选”模式,就像一个单选按钮组一样,但却没有直接提供单选按钮组所期望的功能,比如监听选择更改的事件。我认为这就是为什么人们认为这里的“选择”意味着“选择”。 - LarsH

3

首先,您应该设置ChoiceMode,然后,在ListView中,由于setOnItemSelectedListener注册在AdapterView中,并在handleDataChanged()方法中回调,所以不会接受选择事件,但是AbsListView类覆盖了这个方法并且从不回调OnItemSelectedListener

enter image description here

您可以通过在setOnItemClickListener中使用此方法来获取所选项目。

     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());

        }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接