不能用imagebutton点击listview行
我有问题与listview。 其项目(行)有图像button。 imagebutton有“android:onClick”,所以这onclick事件正在工作,但点击行不起作用。 如果我从行项目中删除imagebutton,点击行工作(列表视图有正确的onclick列表)。 我该如何解决它? 我需要onclick事件,当用户点击imagebutton和标准点击事件,当用户select行(不要点击图像button,但点击行)
我的列表视图:
<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" />
不幸,
android:focusable="false" android:focusableInTouchMode="false"
不适用于ImageButton
。
我终于在这里find了解决办法。 在这些项目的布局xml中,添加
android:descendantFocusability="blocksDescendants"
到根视图。
它适用于具有ImageButton
的ListView
。 根据官方的说法, blocksDescendants
意味着ViewGroup
会阻止它的后代接受焦点。
您可以使用自定义适配器为您的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); }
如果您需要帮助创build自定义适配器,请参阅此处 。
如果一行listView有任何可点击的元素,像Button
, Image
.. onItemClick
,那么onItemClick
将不起作用。 所以你需要在列表适配器的getView
中编写click监听器。
为更多阅读这个 。
为您的button设置这些属性:
android:focusable="false" android:focusableInTouchMode="false"
或者您可以在您的适配器类中dynamic设置它:
yourButton.setFocusable(false); yourButton.setFocusableInTouchMode(false);
并确保你设置select模式为单一列表视图:
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
如果一行有多个可点击的元素,onItemClick()将不起作用。 您将需要在getView()
方法中设置OnClickListener
。 将侦听器存储在视图的标记中,以便它们可以被回收,将方法添加到您的侦听器,以便它们可以专用于不同的行。
@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; }
在我的情况下, android:descendantFocusability="blocksDescendants"
为主层不起作用,既不在ListView中。 我也尝试了android:focusable="false" android:focusableInTouchMode="false"
我听说它是button的工作,但我有ImageButton,所以它没有。
但是,在布局的CS文件中设置button的属性工作。
var imageButton = view.FindViewById<ImageButton>(Resource.Id.imageButton1); imageButton.Focusable = false; imageButton.FocusableInTouchMode = false; imageButton.Clickable = true;
上面没有一个单一的答案为我工作,但一个组合。
我现在在XML 和 Java中的ImageButtons上设置android:descendantFocusability="blocksDescendants"
在ListView和android:focusable="false" android:focusableInTouchMode="false"
android:descendantFocusability="blocksDescendants"
android:focusable="false" android:focusableInTouchMode="false"
我还设置了ListView上的descendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)
focusable(false), focusableInTouchMode(false), clickable(true)
的ImageButtons。