具有OnItemClickListener的ListView


77

ListViewRatingBar和使用自定义ImageButton。这是我的问题:单击我的时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();
    }
});

请添加一些代码。为什么不起作用?一个错误?
伊万

我没有收到任何错误,即使正在调试也没有进入..我将发布一些代码。
NikhilReddy 2011年

1
@gujjula nikhilreddy发布一些代码。
Venky

3
我之前已经检查过这个问题。<BR/>检查我的文章,以了解原因和解决方法:xjaphx.wordpress.com/2011/07/14/... <BR/>我想你见面场景3
皮特休斯敦

1
我在这篇文章中找到了答案,第一条评论是:stackoverflow.com/questions/5551042/…–
卡洛斯·埃斯皮诺萨

Answers:


124

尽管这是一个非常古老的问题,但我仍在发布答案,以便对您有所帮助。如果要在列表视图中使用任何布局,请使用...

android:descendantFocusability="blocksDescendants"    

...在列表内的第一个父布局上。这就像魔术一样,单击将不会被列表内的任何元素占用,而是直接转到列表项。


2
太棒了 它
很有帮助

1
它为我工作。当我在上面添加属性时,列表单击以及按钮单击均起作用。谢谢。
Raghuveer 2014年

1
大!!答案..干杯:)
swiftBoy 2014年

谢谢。自3年以来,我一直在开发android应用。从来没有想到过这个简单的技巧。
Venkat Vinay

一整天都被同一问题困扰着。.非常感谢...从来没有想过
Jitendra Sawant

18

嘿检查一下,对我有用...希望它对你也有用

如果列表项包含 ImageButton

问题:OnItemClickListener根本什么都没有回应!

原因:不知道

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

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

2: button.setFocusable(false);


1
救了我。谢谢
Darko Petkovski 2014年

18

我有一个扩展ListActivity的活动。

我尝试在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!");

}


10

如果列表项视图包含按钮,复选框或图像按钮,则onitemclicklistener和onitemlongclicklistener具有自己的onclick侦听器,因此无法正常工作。

将focusable设置为false

holder.button.setFocusable(false);

9

1)检查您使用的是OnItemClickListener还是OnClickListener(ListView不支持)
文档Android开发人员ListView

2)检查是否已将侦听器正确添加到ListView。它钩在ListView而不是ListAdapter上!

ListView.setOnItemClickListener(listener);

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


我正在使用的代码扩展了listactivity。这是我的codeListView lv = getListView(); setContentView(lv); lv.setOnItemClickListener(new OnItemClickListener(){ ();}}); }
NikhilReddy 2011年

5

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

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

4

setClickable为ImageButton的false像这样

imagebutton.setClickable(false);

然后执行OnItemClickListener到listview。


4

如果您以编程方式定义ListView:

mListView.setDescendantFocusability(ListView.FOCUS_BLOCK_DESCENDANTS);

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

2

在Java中的其他建议

listitem.setClickable(false);

或在xml中:

android:clickable="false"

效果很好



1

只需将行插入RatingBar:

android:isIndicator="true"

在XML中,等级栏看起来像这样。

<RatingBar
    android:id="@+id/ratingBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="6dp"
    android:isIndicator="true"
    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false" />


1
lv.setOnItemClickListener( new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView < ? > parent, View view,
                            int position, long id) {
        // TODO Auto-generated method stub

    }
} );

0

我能提供的最简单的解决方案和最简单的方法就是此。您只需要执行以下两个步骤。

1.将此添加到您的XML文件中。

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:id="@+id/list_view"
        android:layout_below="@+id/info_text"
        />

  1. 将此添加到您的MainActivity文件中。

        ListView listView;
        listView = findViewById(R.id.list_view);

        String[] fruits = new String[5];
        fruits[0]="hello";
        fruits[1]="hello";
        fruits[2]="hello";
        fruits[3]="hello";
        fruits[4]="hello";

        List newList = new ArrayList(Arrays.asList(fruits));
        ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, newList);
        listView.setAdapter(arrayAdapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView parent, View view, int position, long id) {
                String selectedItem = (String) parent.getItemAtPosition(position);
                Toast.makeText(DisplayPannel.this, selectedItem, Toast.LENGTH_SHORT).show();            }
        });


0

很多人问,如果您只想单击列表视图,则列表中的子项的宽度不能为“ match_parent”。

即使将“ Focusable”设置为false,也不会起作用。将孩子的宽度设置为wrap_content

<TextView
    android:id="@+id/itemchild"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    ...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.