QOnItemClickListener不使用包含ListVIEW项的按钮

我有ListView和定制的Adapter以这种方式提供ViewListView

   public View getView(int position, View convertView, ViewGroup parent)
   {
        RelativeLayout.LayoutParams lineParams;
        RelativeLayout line=new RelativeLayout(context);

        TextView tv=new TextView(context);
        tv.setText("Text in postion="+i);
        lineParams=new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        lineParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        line.addView(tv, lineParams);
        lineParams.addRule(RelativeLayout.CENTER_IN_PARENT);

        //checkbox
        CheckBox checkBox=new CheckBox(context);
        lineParams=new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        lineParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        lineParams.addRule(RelativeLayout.CENTER_IN_PARENT);
        line.addView(checkBox, lineParams);
        return line;
    }

ListView

setOnItemClickListener()的某个地方有ListView,它应该拦截项单击事件。我的问题是,每当我试图将复选框添加到项中时,我的CheckBox没有任何响应。如果我跳过Button或任何其他CheckBox,它就会工作。

我真的被这个问题困住了,我试过各种各样的布局,对齐,包装等等-没用。似乎ListView干扰了项单击事件。

有什么办法克服吗?

2011-12-07 10:15:16  barmaley

A回答

  • 1

    只需将这一行添加到项目视图,而不是listview本身

    android:focusable="false"
    

    android自定义列表视图无法单击项目中查看有关此操作的详细信息

    2017-05-23 10:31:34  Community Pratik
  • 2

    如果列表项中有图像按钮,则需要添加:

    android:descendantFocusability="blocksDescendants"
    

    到根列表项元素[例如根布局]。

    然后在列表项中的每个图像按钮中,您需要添加:

    android:focusableInTouchMode="true"
    

    这对我很有效-但我使用的是ImageButtons,而不是标准按钮。

    2015-10-17 14:43:13  dandev91
  • 3

    我也遇到过同样的问题,我曾试图将android:focusable="false"设置为listview,但它不起作用,然后我将此添加到listview项。就像在我的listview项目中,我使用了产生问题的toggle按钮,我将android:focusable="false"添加到toggle按钮,listview on项目单击listener再次开始工作

    2013-12-04 07:35:12  Jaiprakash Soni
  • 4

    在列表视图中添加以下行

    android:choiceMode="singleChoice"
    

    或者确保将以下行设置为布局文本字段

    android:focusable="false"
    android:focusableInTouchMode="false"
    android:clickable="false"
    
    2016-03-28 01:54:55  GameBug
  • 5

    我的listview中也有一个按钮的问题。不幸的是,对于适配器中的所有对象,仅将焦点设置为false对我不起作用。

    我现在有一个解决办法。

    在适配器中,如果尚未创建按钮(或其他可单击对象)的onclicklistener。在onclicklistener中,您可以自己调用onitemclicklistener。

    public void onClick(View v) {
        mOnItemClickListener.setOnItemClick(mListView, v, vPos, vId);
    }
    

    这意味着你需要给你的适配器访问父ListVIEW和OnItMeCyListListNER。

    2012-11-27 14:50:00  Vincent Ketelaars
  • 6

    您可以考虑在ListView项目中编写OnTouchEvent,并将适当的TouchEvent发送给您的子视图按钮。

    2016-10-09 05:31:37  Lion
  • 7

    我知道上面的解决方案都不起作用,我试过修改XML属性,但是这些都不起作用,但是我以一种新的方式实现了它。方法如下:

    使用方法CheckBoxOnCheckListener创建一个接口onCheckBoxChecked,并传递所需的参数,在活动或包含列表视图的片段中实现接口CheckBoxOnCheckListener

    接下来在适配器中,声明一个mListenerCheckBoxOnCheckListener,并将其作为参数从fragment/activity传递给适配器的构造函数,并将其强制转换为CheckBoxOnCheckListener,然后分配给mListener

    下一组mListener设置为itemView.onClickCheckBox.onCheckCheckedListeneronCheckChanged方法调用mListener.onCheckBoxChecked

    就这样。它一定会有用的,对我有用。仅限下午代码。

    2018-07-19 18:23:11  Amit
  • 8

    如果在ListView中使用Activity,请确保已设置setOnItemClickListener()

    myListView.setOnItemClickListener(this); // if your activity implement OnItemClickListener
    
    2012-09-28 16:18:16  Raghav Sood grzesl