57

我遇到了麻烦ListView。它的项目(行)有一个ImageButton. 已设置,因此此ImageButton事件有效,但单击行不起作用。android:onClickonClick

如果我ImageButton从行项目中删除,请单击行工作(ListView具有正确的onClick侦听器)。我该如何解决?我需要onClick用户单击ImageButton时的事件,以及用户选择行时的标准单击事件(不是单击ImageButton而是单击行)。

我的列表视图:

<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" /> 
4

7 回答 7

180

很遗憾,

android:focusable="false"
android:focusableInTouchMode="false"

不适用ImageButton

我终于在这里找到了解决方案。在这些项目的布局 xml 中,添加

android:descendantFocusability="blocksDescendants" 

到根视图。

它非常适合ListView具有ImageButtons 的 a。根据官方参考blocksDescendants表示ViewGroup将阻止其后代接收焦点。

于 2013-07-23T06:49:26.237 回答
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);
}

如果您在创建自定义适配器时需要帮助,请参阅此处。

于 2012-07-11T08:20:27.300 回答
6

如果一行 listView 有任何可点击的元素,如Button, Image..etc..thenonItemClick将不起作用。所以你需要在getView你的列表适配器中编写点击监听器。

有关更多信息,请阅读

于 2012-07-11T08:17:02.103 回答
2

为您的按钮设置这些属性:

      android:focusable="false"
      android:focusableInTouchMode="false"

或者您可以在适配器类中动态设置它:

        yourButton.setFocusable(false);
    yourButton.setFocusableInTouchMode(false);

并确保将列表视图的选择模式设置为单一:

       listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
于 2012-07-11T08:23:01.753 回答
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;
于 2015-05-05T15:13:55.547 回答
1

如果一行有多个可点击元素,onItemClick() 将不起作用。您需要OnClickListenergetView()方法中设置。将侦听器存储在 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;
    }
于 2013-07-04T10:26:26.500 回答
0

上面没有一个答案对我有用,但是一个组合可以。

我现在在 XMLJava 中的 ListView 和 ImageButtons 上进行设置,我还在android:descendantFocusability="blocksDescendants"ListView和ImageButtons 上进行了设置。android:focusable="false" android:focusableInTouchMode="false"descendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)focusable(false), focusableInTouchMode(false), clickable(true)

于 2015-05-13T08:29:36.773 回答