Как я могу сделать событие клика на элементе CardView из RecyclerView - PullRequest
0 голосов
/ 22 апреля 2019

Я сослался на Пример простого Android RecyclerView для событий создания клика на элементах из Recyclerview. И затем я применяю этот способ к CardView из Recyclerview, но мне это не удалось.

Событие OnClick на ViewHolder не работает. Похоже, коды почти одинаковы. Я не знаю, в чем проблема.

Я только что скопировал коды из простого примера Android RecyclerView

А затем изменил ArrayList на ArrayList Кроме того, я заменяю xml, который содержит код textview на cardview.

Мне удалось событие, когда я положил onClickListener на onBindViewHolder. Но я слышал, что это делает приложение тяжелее. Поэтому я хочу избежать этого.

MainActivity.java

public class MainActivity extends AppCompatActivity implements MyAdapter.ItemClickListener{

    RecyclerView mRecyclerView;
    MyAdapter mAdapter;
    RecyclerView.LayoutManager mLayoutManager;
    ArrayList<MyData> myDataset;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

        // use this setting to improve performance if you know that changes
        // in content do not change the layout size of the RecyclerView
        mRecyclerView.setHasFixedSize(true);

        // use a linear layout manager
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);

        myDataset = new ArrayList<>();
        myDataset.add(new MyData("#InsideOut", R.drawable.a));
        myDataset.add(new MyData("#Mini", R.drawable.b));
        myDataset.add(new MyData("#ToyStroy", R.drawable.c));

        mAdapter = new MyAdapter(this, myDataset);
        mAdapter.setClickListener(this);
        mRecyclerView.setAdapter(mAdapter);
    }
    @Override
    public void onItemClick(View view, int position) {
        Toast.makeText(this, "You clicked " + mAdapter.getItem(position) + " on row number " + position, Toast.LENGTH_SHORT).show();
    }
}

MyAdapter.java

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private ArrayList<MyData> mDataset;
    private LayoutInflater mInflater;

    private ItemClickListener mClickListener;


    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        // each data item is just a string in this case
        public ImageView mImageView;
        public TextView mTextView;
        public CardView cv;

        public ViewHolder(View view) {
            super(view);
            mImageView = (ImageView)view.findViewById(R.id.image);
            mTextView = (TextView)view.findViewById(R.id.textview);
            cv = (CardView)view.findViewById(R.id.cardview);
            view.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
            Log.d("이거이거", ""+getAdapterPosition());
        }
    }

    // Provide a suitable constructor (depends on the kind of dataset)
    public MyAdapter(Context context, ArrayList<MyData> myDataset) {
        this.mDataset = myDataset;
        this.mInflater = LayoutInflater.from(context);
    }

    // Create new views (invoked by the layout manager)
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = mInflater.inflate(R.layout.item_cardview, parent, false);
        return new ViewHolder(v);
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        Log.d("position", position+"");

        holder.mTextView.setText(mDataset.get(position).text);
        holder.mImageView.setImageResource(mDataset.get(position).img);

    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return mDataset.size();
    }
    MyData getItem(int id) {
        return mDataset.get(id);
    }

    void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }
    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }
}

class MyData{
    public String text;
    public int img;
    public MyData(String text, int img){
        this.text = text;
        this.img = img;
    }
}

Ответы [ 4 ]

1 голос
/ 23 апреля 2019

Просто добавьте эти строки, приведенные ниже в onBindViewHolder вы уже добавили это

cv = (CardView) view.findViewById (R.id.cardview);

, чтобы она работала или убедитесь, что вы указали CardView в XML-идентификаторе, что имя является cardview

cv = (CardView)view.findViewById(R.id.cardview);

holder.cv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mClickListener.onItemClick(v, position)
        }
    });
1 голос
/ 23 апреля 2019
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    // each data item is just a string in this case
    public ImageView mImageView;
    public TextView mTextView;
    public CardView cv;

    public ViewHolder(View view) {
        super(view);
        mImageView = (ImageView)view.findViewById(R.id.image);
        mTextView = (TextView)view.findViewById(R.id.textview);
        cv = (CardView)view.findViewById(R.id.cardview);

      //for whole cardview (If you want to click only card)
      view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Do the action.
            }
        });

    //if you want to click the only particular item in the CardView
    mImageView .setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               //Do the action.
            }
        });

    }
}

Попробуйте этот фрагмент и дайте мне знать. Я могу решить это для вас, если это не сработает.

1 голос
/ 23 апреля 2019

Проблема в том, что ваша interface является частью adapter class, а ваша onclicklistener является частью holder class.Вам нужно вызвать clicklistener из адаптера onBindViewHolder. Для этого вам нужно присвоить id корневому макету itemholder layout file и найти представление по id в itemholder constructor. После этого вы можетевызовите прослушиватель кликов, как показано ниже.

 @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        Log.d("position", position+"");

        holder.mTextView.setText(mDataset.get(position).text);
        holder.mImageView.setImageResource(mDataset.get(position).img);
        holder.view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mClickListener.onItemClick(v, position)
        }
    });
    }
1 голос
/ 22 апреля 2019

Есть также способ сделать это

 public ViewHolder(final View view) {
        super(view);
        mImageView = (ImageView)view.findViewById(R.id.image);
        mTextView = (TextView)view.findViewById(R.id.textview);
        cv = (CardView)view.findViewById(R.id.cardview);

        cv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mClickListener != null) mClickListener.onItemClick( view,getAdapterPosition());
            }
        });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...