OnItemClickListener不适用于包含按钮的ListView项

时间:2011-12-07 10:15:17

标签: android listview button adapter onitemclicklistener

我有ListView个自定义Adapter以这种方式向View提供ListView

   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 个答案:

答案 0 :(得分:51)

只需将此行添加到项目视图中而不是listView本身

android:focusable="false"

Android custom ListView unable to click on items

查看有关此内容的更多详细信息

答案 1 :(得分:16)

如果列表项中包含ImageButtons,则需要添加:

android:descendantFocusability="blocksDescendants"

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

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

android:focusableInTouchMode="true"

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

答案 2 :(得分:13)

我也遇到了同样的问题,我试图将android:focusable="false"设置为listview,但它不起作用然后我将它添加到listview项目..就像在我的listview项目中我已经使用了切换按钮创建了问题,我将android:focusable="false"添加到切换按钮,列表视图上的项目点击监听器再次开始工作

答案 3 :(得分:1)

将以下行添加到listView

android:choiceMode="singleChoice"

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

android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"

答案 4 :(得分:0)

我的ListView中也遇到了Button的问题。不幸的是,只是将我的适配器中的所有对象的焦点设置为false对我来说不起作用。

我现在有一个解决方法。

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

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

这意味着你需要让你的适配器访问父ListView和OnItemClickListener。

答案 5 :(得分:0)

您可以考虑在listview项目中编写OnTouchEvent,并将正确的touchEvent发送到子视图,即按钮。

答案 6 :(得分:0)

我知道上述解决方案都无法使用。我尝试更改xml属性,但这些方法无法解决,但是我以新方式实现了它。 方法如下:

使用方法CheckBoxOnCheckListener创建一个接口 onCheckBoxChecked并传递所需的参数,在您的 activity CheckBoxOnCheckListener包含 listView 的>片段。

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

接下来将mListener设置为mListeneritemView.onClick,然后将CheckBox.onCheckCheckedListener方法调用onCheckChanged设置。

就是这样。它肯定会工作,对我有用。 对于仅下午的代码。

答案 7 :(得分:-5)

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

myListView.setOnItemClickListener(this); // if your activity implement OnItemClickListener