OnItemClickListener与包含按钮的ListView项目不兼容。

33

我有一个使用自定义适配器(Adapter)的ListView,该适配器以以下方式向ListView提供View

   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项目的点击事件。

有什么建议可以解决这个问题吗?

8个回答

54

1
这没什么帮助!还有其他选项吗? - Barmaley
5
好的,我明白了 - 它有效。我需要对项目视图而不是 ListView 本身调用 setFocusable(false)。谢谢! - Barmaley
5
如果将抢占焦点的视图(即复选框或按钮)的可聚焦属性设置为false,则该方法有效。 - r1k0
在我的适配器中,我设置了 btn.setFocusable(false),这解决了问题。我认为Android在加载XML后将 focusable 设置为true。 - Sufian
谢谢@Pratik,这对我很有帮助 :) - Dharmik Patel
显示剩余2条评论

19

如果列表项中有ImageButton,您需要添加:

android:descendantFocusability="blocksDescendants"

在根列表项元素(如根布局)中添加:

然后在列表项中的每个ImageButton中,您需要添加:

android:focusableInTouchMode="true"

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


PERFECT :-) Thanks - Matteo

13

我也遇到了同样的问题。我尝试将android:focusable="false"设置为listview,但它不起作用。然后我在listview项中添加了这个选项。例如,在我的listview项中,我使用了Toggle按钮,这导致了问题。我将android:focusable="false"添加到Toggle按钮和listview上的项单击侦听器再次开始工作。


1
在你的 listView 中添加以下行:
android:choiceMode="singleChoice"

或者确保将以下行设置为您的布局文本字段。
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"

0

我知道以上的解决方案都不会起作用。我尝试更改XML属性,但是那些并没有起作用,但是我用一种新的方式实现了它。

这里是如何实现的:

创建一个名为CheckBoxOnCheckListener接口,其中包含方法onCheckBoxChecked并传递所需参数,在包含listViewactivityfragment中实现CheckBoxOnCheckListener接口。

接下来,在您的适配器中,将mListener声明为CheckBoxOnCheckListener,并从fragment/activity将其作为参数传递给Adapter的构造函数,并将其转换为CheckBoxOnCheckListener并分配给mListener

接下来,将mListener设置为itemView.onClickCheckBox.onCheckCheckedListener,并在onCheckChanged方法调用mListener.onCheckBoxChecked

就是这样。它肯定会起作用,对我有用。需要代码请私信。


0
你可以考虑在你的ListView项中编写自己的OnTouchEvent,并将正确的touchEvent发送给你的子视图,即按钮。

0

我之前也在我的ListView中遇到过按钮的问题。不幸的是,仅仅为适配器中的所有对象设置焦点为false并没有解决我的问题。

现在我有了一个解决方法。

在您的适配器中为按钮(或其他可点击对象)创建一个OnClickListener,如果您还没有这样做。在该OnClickListener中,您自己调用OnItemClickListener。

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

这意味着您需要让适配器同时访问父ListView和OnItemClickListener。


-6
如果您在Activity中使用ListView,请确保已设置setOnItemClickListener()
myListView.setOnItemClickListener(this); // if your activity implement OnItemClickListener

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