不能用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" 

到根视图。

它适用于具有ImageButtonListView 。 根据官方的说法, 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有任何可点击的元素,像ButtonImage .. 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。