我有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
项目点击事件。
任何想法如何克服?
答案 0 :(得分:51)
只需将此行添加到项目视图中而不是listView本身
android:focusable="false"
查看有关此内容的更多详细信息
答案 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
设置为mListener
或itemView.onClick
,然后将CheckBox.onCheckCheckedListener
方法调用onCheckChanged
设置。
就是这样。它肯定会工作,对我有用。 对于仅下午的代码。
答案 7 :(得分:-5)
如果您在ListView
中使用Activity
,请确保您已设置setOnItemClickListener()
myListView.setOnItemClickListener(this); // if your activity implement OnItemClickListener