带有OnItemClickListener的ListView

85

我正在使用自定义的ListView,其中包含RatingBarImageButton。我的问题是:当我点击ListView时,OnItemClickListener不起作用。请问有人能帮忙解决吗?

ListView lv = getListView();
setContentView(lv);
lv.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        Toast.makeText(SuggestionActivity.this, "" + position, Toast.LENGTH_SHORT).show();
    }
});

请添加一些代码。为什么它不起作用?出现了错误吗? - Ivan
即使我在调试时也没有收到任何错误,它也不会进入内部。我将发布一些代码。 - NikhilReddy
1
@gujjula nikhilreddy 发布一些代码。 - Venky
3
我之前已经检查过这个问题了。请查看我的文章以找到原因和解决方案:http://xjaphx.wordpress.com/2011/07/14/listview-doesnt-respond-to-onitemclicklistener/ 我猜想您遇到了第三种情况。 - Pete Houston
1
我在这篇文章中找到了答案,第一条评论: https://dev59.com/3m035IYBdhLWcg3wNtRw - Carlos Espinoza
显示剩余4条评论
17个回答

131

虽然这是一个非常老的问题,但我仍然发表了一篇回答,以便它可以帮助到某些人。 如果您在列表视图中使用任何布局,则请使用...


android:descendantFocusability="blocksDescendants"    

...在列表中的第一个父级布局上。这就像魔法一样,点击事件不会被列表内部的任何元素消费,而是直接传递到列表项。


22

我有一个扩展了ListActivity的Activity。

我尝试在onCreate方法中做类似于这样的事情:

ListView listView = getListView();
listView.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {

        Log.i("Hello!", "Y u no see me?");

    }

});

但那并没有起作用。

相反,我只需要覆盖onListItemClick函数:

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {

    Log.i("Hello!", "Clicked! YAY!");

}

18

嘿,看看这个,对我有效... 希望你也有效

如果列表项包含ImageButton

问题: OnItemClickListener根本没有响应!

原因:不知道

解决方案:在代码中,将ImageButton的焦点设置为"false"

1:ImageButton button = (ImageButton) convertView.findViewById(R.id.imageButton);

2:button.setFocusable(false);


13

如果您想在列表视图中启用项目单击,请使用

listitem.setClickable(false);

这乍一看可能是错误的,但它是有效的!


1
如果在XML中进行操作,请确保使实际子项(而不是父布局)不可点击。此外,这个答案应该更高! - Hamburg is nice

11
如果列表项视图包含按钮、复选框或图像按钮,onitemclicklistener 和 onitemlongclicklistener 将无法工作,因为它们有自己的 onclick 监听器。
将 focusable 设置为 false。
holder.button.setFocusable(false);

9

1) 检查您是否使用了OnItemClickListener或OnClickListener(这不支持ListView)
文档 Android Developers ListView

2) 检查您是否正确地向ListView添加了侦听器。它是挂在ListView上而不是ListAdapter上!

ListView.setOnItemClickListener(listener);

3) 如果你需要使用 OnClickListener,请检查你是否使用了 DialogInterface.OnClickListenerView.OnClickListener (如果没有经过验证或同时使用两者,则可以轻松交换它们)


我正在使用的代码扩展了一个ListActivity。以下是我的代码:ListView lv = getListView(); setContentView(lv); lv.setOnItemClickListener(new OnItemClickListener() {@Override public void onItemClick(AdapterView arg0, View arg1,int position, long arg3) { Toast.makeText(SuggestionActivity.this, "" + position, Toast.LENGTH_SHORT).show(); }}); - NikhilReddy

5

您还可以使用lambda。 在Java 1.7或更早版本的JVM下不支持Lambda语法。

listView.setOnItemClickListener((parent, view, position, id) -> {
    ...
});

5
listPaired = (ListView) findViewById( R.id.listView1 );
listPairedData = new ArrayList < String >();
araPaired = new ArrayAdapter( this, android.R.layout.simple_list_item_1, listPairedData );
listPaired.setAdapter( araPaired );
listPaired.setOnItemClickListener( listPairedClickItem );

private OnItemClickListener listPairedClickItem = new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView < ? > arg0, View arg1, int arg2, long arg3) {

        String info = ( (TextView) arg1 ).getText().toString();
        Toast.makeText( getBaseContext(), "Item " + info, Toast.LENGTH_LONG ).show();
    }
};

4
如果您通过编程方式定义您的ListView:
mListView.setDescendantFocusability(ListView.FOCUS_BLOCK_DESCENDANTS);

4
像这样将ImageButton的setClickable属性设置为false。
imagebutton.setClickable(false);

然后对列表视图执行OnItemClickListener

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