我在listview上遇到了麻烦。它的项目(行)有图像按钮。 imagebutton有“android:onClick”所以这个onclick事件正在运行,但点击行不起作用。如果我从行项目中删除图像按钮,单击行工作(列表视图具有正确的onclick列表器)。我该如何解决?当用户点击图像按钮和标准点击事件时,我需要onclick事件,当用户选择行时(不单击图像按钮但单击行)
我的列表视图:
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/restaurants_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:divider="@color/list_devider"
android:dividerHeight="1dp"
android:cacheColorHint="@color/list_background" />
答案 0 :(得分:177)
不幸的是,
android:focusable="false"
android:focusableInTouchMode="false"
不适用于ImageButton
。
我终于找到了解决方案here。在这些项目的布局xml中,添加
android:descendantFocusability="blocksDescendants"
到根视图。
适用于ListView
的{{1}}。根据{{3}},ImageButton
表示blocksDescendants
会阻止其后代获得焦点。
答案 1 :(得分:7)
您可以为listView使用自定义适配器(如果尚未使用)。在那里,在适配器的getView(int position, View inView, ViewGroup parent)
方法中执行以下操作:
@Override
public View getView(int position, View inView, ViewGroup parent) {
View v = inView;
ViewHolder viewHolder; //Use a viewholder for sufficent use of the listview
if (v == null) {
LayoutInflater inflater = (LayoutInflater) adaptersContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.list_item, null);
viewHolder = new ViewHolder();
viewHolder.image = (ImageView) v.findViewById(R.id.ImageView);
v.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) v.getTag();
}
.....
viewHolder.image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Click on imageView
}i
});
v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Click on listView row
}
});
.....
return (v);
}
如果您需要有关创建自定义适配器的帮助,请参阅here。
答案 2 :(得分:6)
如果listView行有任何可点击的元素,例如Button
,Image
等等,那么onItemClick
将无效。因此,您需要在列表适配器的getView
中编写单击侦听器。
更多阅读this。
答案 3 :(得分:2)
为按钮设置以下属性:
android:focusable="false"
android:focusableInTouchMode="false"
或者您可以在适配器类中动态设置它:
yourButton.setFocusable(false);
yourButton.setFocusableInTouchMode(false);
并确保将列表视图的选择模式设置为单一:
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
答案 4 :(得分:2)
就我而言,主层的android:descendantFocusability="blocksDescendants"
在ListView中都不起作用。我也试过android:focusable="false"
android:focusableInTouchMode="false"
,我听说它适用于Buttons,但我有ImageButton所以它没有。
但是在布局的CS文件中设置按钮的属性是有效的。
var imageButton = view.FindViewById<ImageButton>(Resource.Id.imageButton1);
imageButton.Focusable = false;
imageButton.FocusableInTouchMode = false;
imageButton.Clickable = true;
答案 5 :(得分:1)
如果一行有多个可点击元素,onItemClick()将无效。您需要在OnClickListener
方法中设置getView()
。将侦听器存储在View的标签中,以便可以回收它们,向侦听器添加方法,以便它们可以专门用于不同的行。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
RowClickListeners listeners = (RowClickListeners) view.getTag();
if (listeners == null) {
listeners = new RowClickListeners();
}
// Row click listener:
RowClickListener onClickListener = listeners.rowClickListener;
if (onClickListener == null) {
onClickListener = new RowClickListener();
listeners.rowClickListener = onClickListener;
}
onClickListener.setToPosition(pos);
view.setOnClickListener(onClickListener);
// Overflow listener:
View btn = view.findViewById(R.id.ic_row_btn);
ButtonListener btnListener = listeners.buttonClickListener;
if (rowListener == null) {
btnListener = new ButtonListener(activity);
listeners.rowClickListener = btnListener;
}
btnListener.setToPosition(pos);
btnListener.setCollection(collectionId);
btn.setOnClickListener(btnListener);
}
public static class RowClickListeners {
public RowClickListener rowClickListener;
public ButtonListener buttonClickListener;
}
答案 6 :(得分:0)
上面没有一个单一的答案对我有用,但组合确实有效。
我现在在ListView上设置android:descendantFocusability="blocksDescendants"
,在Java中的ImageButtons上设置android:focusable="false" android:focusableInTouchMode="false"
AND 在Java中我也在ListView上设置descendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)
并focusable(false), focusableInTouchMode(false), clickable(true)
1}}在ImageButtons上。