无法使用imagebutton单击listview行

时间:2012-07-11 08:13:06

标签: android listview imagebutton

我在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" /> 

7 个答案:

答案 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行有任何可点击的元素,例如ButtonImage等等,那么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上。