【问题标题】:Android Recycler view with onClickListener not working带有 onClickListener 的 Android Recycler 视图不起作用
【发布时间】:2016-10-08 08:16:00
【问题描述】:

我正在尝试在我的 recyclerview 上的一张图片上设置 onClickListener,但点击不起作用。

看起来似乎没有看到有一个 onClickListener,因为当我在我的侦听器上为调试器设置一个“点”时,它并没有达到目标。

我做错了什么?

    public class Item_List_Adapter extends RecyclerView.Adapter<Item_List_Adapter.MyViewHolder> {
        // declare array
        private String[] mDataset;
        private Context mContext;

        public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
            public TextView itemName;
            public ImageView mAddBtn;

            public MyViewHolder(View v){
                super(v);

                itemName = (TextView) v.findViewById(R.id.item_name);
                mAddBtn = (ImageView) v.findViewById(R.id.action_add);
            }

            @Override
            public void onClick(View v) {
                System.out.println("TEST: ");
                switch (v.getId()) {
                    case R.id.action_add:
                        System.out.println("TEST2: ");
                        break;
                    default:
                        break;
                }
            }
        }

        // constructor
        public Item_List_Adapter(Context context, String[] myDataset) {
            mDataset = myDataset;
            mContext = context;
        }

        @Override
        public int getItemCount() {
            return mDataset.length;
        }

        @Override
        public Item_List_Adapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            // create a new view
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
            MyViewHolder nv = new MyViewHolder(v);
            return nv;
        }

        @Override
        public void onBindViewHolder(Item_List_Adapter.MyViewHolder holder, final int position) {
            holder.itemName.setText(mDataset[position]);

            holder.mAddBtn.setOnClickListener(holder);

        }
    }

我的 XML 文件在回收站视图中膨胀

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="10dp"
    android:paddingBottom="10dp">

    <LinearLayout
        android:id="@+id/list_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginEnd="15dp"
        android:layout_marginStart="15dp">

        <ImageView
            android:id="@+id/action_check"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_action_check"
            android:alpha="0.3"
            />

        <TextView
            android:id="@+id/item_name"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight=".2"
            android:hint="Wine"
            android:alpha="0.3"
            android:gravity="start|center"
            android:paddingStart="5dp"
            android:paddingLeft="5dp"/>

        <ImageView
            android:id="@+id/action_remove"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_action_remove_green"
            android:onClick="item_remove"
            />
        <ImageView
            android:id="@+id/action_add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_action_add_blue"
            />
        <ImageView
            android:id="@+id/action_chart"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_action_chart"
            android:scaleType="centerInside"
            android:onClick="chart_detail"
            />

    </LinearLayout>

</LinearLayout>

提前致谢

【问题讨论】:

  • 最好这样使用它:holder.mAddBtn.setOnClickListener(holder) 并在你的MyViewHolder 中实现OnClickListener 接口
  • 你是什么意思?因为如果我写这个我得到:视图中的 setOnclickListener(android.view.View.OnClickListener) 不能应用于 (com.app.pierre.myapp.adapter.Item_List_Adapter.MyViewHolder)
  • 尝试在你的viewholder构造函数中添加onclicklistener ;)
  • 我已经用你的答案编辑了我的问题,所以我在 MyViewHolder 中实现了 onClickListener 并覆盖了 onclick 方法,然后在 onBindViewHodler 中我添加了 setOnClickListener.. 但仍然不起作用:(
  • 你能把xml也显示一下吗

标签: android android-recyclerview


【解决方案1】:

你应该使用 Log 输出到控制台

Log.d("TAG","TEST: );

为了实验,在你的 ViewHolder 构造函数中试试这个

mAddBtn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("TAG","TEST: );
        }
    });

如果它不起作用,那么某些东西阻止了点击,这可能只是在 xml 中设置 clickable="true",或者找出视图前面的内容

【讨论】:

  • 感谢您的回答,日志上也没有出现任何内容。我已经从我的 xml 中删除了所有 clickable=true 。还有什么可以阻止点击?
  • 我在我的问题上添加了我的 XML。
  • 你可以尝试在 xml 中不使用 android:onClick 行吗
【解决方案2】:

以下是我在适配器中的使用方式。希望对您有所帮助:

    public class EventArrayAdapter extends RecyclerView.Adapter<ViewHolder> {
        private OnItemClickListener onItemClickListener;
        public OnItemClickListener getOnItemClickListener() {
            return onItemClickListener;
        }

        public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
            this.onItemClickListener = onItemClickListener;
        }

        public interface OnItemClickListener {
            public void onItemClick(View view, int position);
        }

        @Override
        public void onBindViewHolder(final ViewHolder holder, final int position) {
       //Add your viewHolder.button.setOnClickListener here as normal
        }

       @Override
       public ViewHolder onCreateViewHolder(ViewGroup parent, int arg1) {
            // TODO Auto-generated method stub
            View v = LayoutInflater.from(context).inflate(
                    R.layout.layout_item_event, parent, false);
            final EventViewHolder holder = new EventViewHolder(v);
            v.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    onItemClickListener.onItemClick(v, holder.getAdapterPosition());
                }
            });
            return holder;
        }
    }

【讨论】:

    【解决方案3】:

    像这样更新你的构造函数并尝试。它会起作用的。

    public MyViewHolder(View v){
                super(v);
    
                itemName = (TextView) v.findViewById(R.id.item_name);
                mAddBtn = (ImageView) v.findViewById(R.id.action_add);
    
                mAddBtn.setOnClickListener(this);    
            }
    

    基本上将 onClick 侦听器分配给您的 Imageview

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 2016-08-01
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 2021-03-17
      • 1970-01-01
      相关资源
      最近更新 更多