Android Recycler view с OnClickListener не работает

#android #android-recyclerview

#Android #android-recyclerview

Вопрос:

Я пытаюсь установить OnClickListener на одно из моих изображений в моем recyclerview, но щелчок не работает.

Похоже, что он, похоже, не видит, что есть 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-файл, который раздувается в представлении recycler

 <?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>
  

Заранее спасибо

Комментарии:

1. лучше использовать его так: holder.mAddBtn.setOnClickListener(holder) и реализовать OnClickListener интерфейс в вашем MyViewHolder

2. Что вы имеете в виду? Потому что, если я напишу это, я получу: setOnClickListener(android.view.View. OnClickListener) в представлении не может быть применен к (com.app.pierre.myapp.adapter. Item_List_Adapter. MyViewHolder)

3. попробуйте добавить onclicklistener в свой конструктор viewholder 😉

4. Я отредактировал свой вопрос с вашим ответом, поэтому я внедрил OnClickListener в MyViewHolder и переопределил метод onclick, затем в onBindViewHodler я добавил setOnClickListener.. но все равно не работает: (

5. можете ли вы также показать xml, пожалуйста

Ответ №1:

вы должны использовать журнал для вывода на консоль

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

для эксперимента попробуйте это в вашем конструкторе ViewHolder

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

Если это не работает, значит, что-то блокирует щелчок, это может быть просто установка clickable=»true» в xml или выяснение того, что находится перед представлением

Комментарии:

1. Спасибо за ваш ответ, в журнале тоже ничего не отображается. Я уже удалил все кликабельные = true из своего xml. Что еще может заблокировать щелчок?

2. Я добавил свой XML на свой вопрос.

3. можете ли вы попробовать без строк android: onClick в xml

Ответ №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