不能点击的ListView一行的ImageButton(can't click on lis

2019-06-14 20:13发布

我有一个列表视图的麻烦。 其项目(行)具有的ImageButton。 的ImageButton有“安卓的onClick”所以这个onclick事件工作,但点击排不工作。 如果我从行项目中删除的ImageButton,点击排工程(ListView中有正确的onclick听者)。 我该如何解决呢? 我需要onclick事件当ImageButton的和非标准click事件,当用户选择行用户点击(不能点击的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" /> 

Answer 1:

不幸,

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

不适合工作ImageButton

我终于找到了解决办法在这里 。 在这些项目布局的xml,加

android:descendantFocusability="blocksDescendants" 

到根视图。

它完美的ListView具有ImageButton秒。 根据官方参考 , blocksDescendantsViewGroup将阻止它的后代从接收焦点。



Answer 2:

您可以使用自定义适配器,为您的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);
}

见这里如果你需要帮助创建你的自定义适配器。



Answer 3:

如果ListView控件的一排有一个像任何可点击的元素ButtonImage ..etc..then onItemClick将无法正常工作。 所以,你需要写点击监听getView列表适配器。

更多阅读此 。



Answer 4:

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

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

或者你可以在你的适配器类动态地设置:

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

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

       listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);


Answer 5:

就我而言, android:descendantFocusability="blocksDescendants"主层没有工作,没有在ListView。 我也试过android:focusable="false" android:focusableInTouchMode="false" ,我听说,这是工作的按钮,但我的ImageButton所以也没。

但设置在布局的CS文件中的按钮的特性工作。

var imageButton = view.FindViewById<ImageButton>(Resource.Id.imageButton1);
imageButton.Focusable = false;
imageButton.FocusableInTouchMode = false;
imageButton.Clickable = true;


Answer 6:

如果某行有多个可点击元素,onItemClick()将无法工作。 您将需要设置OnClickListenergetView()方法。 存储听众的视图的标记,以便它们可以被回收,方法添加到您的听众,使他们可以专门针对不同的行。

        @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;
    }


Answer 7:

上面没有唯一的答案为我工作,而是一种组合一样。

我现在设置android:descendantFocusability="blocksDescendants"在ListView和android:focusable="false" android:focusableInTouchMode="false"关于在XML Java中我还设置了ImageButtons descendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)的ListView和focusable(false), focusableInTouchMode(false), clickable(true)的ImageButtons。



文章来源: can't click on listview row with imagebutton