33

我有以这种方式提供ListView的自定义:AdapterViewListView

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

任何想法如何克服?

4

8 回答 8

53

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

android:focusable="false"

从 Android 自定义 ListView 中检查更多详细信息无法点击项目

于 2011-12-07T10:24:04.543 回答
19

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

android:descendantFocusability="blocksDescendants"

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

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

android:focusableInTouchMode="true"

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

于 2015-10-17T14:43:13.540 回答
13

我也遇到了同样的问题,我尝试设置android:focusable="false"为 listview,但它不起作用,然后我将其添加到 listview 项目中。就像在我的 listview 项目中,我使用了造成问题的切换按钮,我添加android:focusable="false"到切换按钮和项目单击侦听器上的列表视图再次开始工作

于 2013-12-04T07:35:12.613 回答
1

将以下行添加到您的 listView

android:choiceMode="singleChoice"

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

android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
于 2016-03-28T01:29:11.893 回答
0

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

我现在有一个解决方法。

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

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

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

于 2012-11-27T14:50:00.553 回答
0

您可以考虑在您的列表视图项目中编写 onOnTouchEvent 并将正确的 touchEvent 发送到您的子视图按钮。

于 2016-10-09T05:31:37.197 回答
0

好吧,我知道上述解决方案都不起作用。我尝试更改 xml 属性,但这些都不起作用,但我以一种新的方式实现了它。方法如下:

使用方法创建接口 并传递所需参数,在包含listView的活动片段中实现接口。CheckBoxOnCheckListeneronCheckBoxCheckedCheckBoxOnCheckListener

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

接下来设置mListeneritemView.onClickorCheckBox.onCheckCheckedListeneronCheckChanged方法调用mListener.onCheckBoxChecked

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

于 2018-07-19T18:23:11.683 回答
-6

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

myListView.setOnItemClickListener(this); // if your activity implement OnItemClickListener
于 2012-08-24T19:32:59.540 回答