Настроить на элементе click listener внутри onBindViewHolder () с помощью RecyclerView.Adapter

У меня есть пользовательский объект:

Student.class

public class Student { private String name; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } } 

Затем я реализую адаптер RecyclerView следующим образом:

MyAdapter.class

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private Context context; private ArrayList<Student> students = new ArrayList<>(); public MyAdapter(Context mContext, ArrayList<Student> mStudents) { this.context = mContext; this.students = mStudents; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(context).inflate(R.layout.item_row, parent, false); return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder holder, int position) { final Student student = students.get(position); holder.name.setText(student.getName()); holder.age.setText(student.getAge()); holder.setClickListener(new ItemClickListener() { @Override public void onClickItem(int pos) { Toast.makeText(context, "CLICK : " + student.getName(), Toast.LENGTH_SHORT).show(); } @Override public void onLongClickItem(int pos) { Toast.makeText(context, "LONG CLICK : " + student.getName(), Toast.LENGTH_SHORT).show(); } }); } @Override public int getItemCount() { return students.size(); } public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { private TextView name; private TextView age; private ItemClickListener mListener; public ViewHolder(View itemView) { super(itemView); name = (TextView) itemView.findViewById(R.id.tv_name); age = (TextView) itemView.findViewById(R.id.tv_age); itemView.setOnClickListener(this); itemView.setOnLongClickListener(this); } public void setClickListener(ItemClickListener listener) { this.mListener = listener; } @Override public void onClick(View view) { mListener.onClickItem(getLayoutPosition()); } @Override public boolean onLongClick(View view) { mListener.onLongClickItem(getLayoutPosition()); return true; } } public interface ItemClickListener { void onClickItem(int pos); void onLongClickItem(int pos); } } 

Как вы можете видеть в onBindViewHolder (), я устанавливаю ItemClickListener для держателя.

 @Override public void onBindViewHolder(ViewHolder holder, int position) { final Student student = students.get(position); holder.name.setText(student.getName()); holder.age.setText(student.getAge()); holder.setClickListener(new ItemClickListener() { @Override public void onClickItem(int pos) { Toast.makeText(context, "CLICK : " + student.getName(), Toast.LENGTH_SHORT).show(); } @Override public void onLongClickItem(int pos) { Toast.makeText(context, "LONG CLICK : " + student.getName(), Toast.LENGTH_SHORT).show(); } }); } 

Но я знаю, что метод onBindViewHolder () будет вызываться каждый раз, когда новый элемент прокручивается в поле зрения. Таким образом, прослушиватель кликов по вызову внутри onBindViewHolder () вызывает дорогостоящие операции внутри него.

Как я могу решить эту проблему?

Solutions Collecting From Web of "Настроить на элементе click listener внутри onBindViewHolder () с помощью RecyclerView.Adapter"

Вам нужно вызвать onClickListener в представлении ViewHolder, т.е. itemView в вашем случае. Он вызовет метод onClick (), как только вы нажмете на полный вид, т.е. root view (itemView в вашем случае)

Вы также можете установить onClickListener на дочерние элементы корня, то есть имя и возраст.

Внутри конструктора ViewHolder (View itemView):

 itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext,"clicked="+ getPosition(),Toast.LENGTH_SHORT).show(); } }); 

Аналогичным образом вы можете также вызвать onLongClickListner. И name.setOnClickLisner () для детского просмотра тоже.

Вы можете установить событие Onclick для определенных аудиторий:

Например:

  holder.layout.setClickListener(new ItemClickListener() { @Override public void onClickItem(int pos) { Toast.makeText(context, "CLICK : " + student.getName(), Toast.LENGTH_SHORT).show(); } 

Вы можете реализовать onClickListener для родительского вида, как onClickListener ниже:

 //holder.view - parent layout inside recyclerView item holder.view.setTag(position); holder.view..setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int pos = (int) v.getTag(); Student student = students.get(pos); // Do your operation } }); 

ИЛИ

Если вы хотите установить onItemClickListener из activity/fragment где recyclerView инициализирован, вы можете onItemClickListener по этой ссылке: http://www.littlerobots.nl/blog/Handle-Android-RecyclerView-Clicks/