使用RecyclerView.Adapter在onBindViewHolder()内设置onItemClickListener

时间:2015-12-22 04:36:46

标签: android android-recyclerview onitemclicklistener

我有一个自定义对象:

Student.class

long c2 = job0.getCounters().findCounter(MyCounter.name1)
                    .getValue();
double getMyVal= (double) c2 / 10000;

然后我像这样实施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; } }

MyAdapter.class

RecyclerView.Adapter

正如您在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()

onItemClickListener()

但我知道每次新项目滚动到视图时都会调用@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()内调用点击侦听器会导致其内部进行昂贵的操作。

如何解决此问题?

4 个答案:

答案 0 :(得分:8)

您需要在onClickListener()的视图上设置ViewHolder,即在您的案例中为itemView。单击完整视图即根视图(在您的情况下为itemView)时,它将调用onClick()方法

您还可以在根的子项上设置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()关于儿童观点。

答案 1 :(得分:2)

您可以为父视图实施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,可以点击以下链接:http://www.littlerobots.nl/blog/Handle-Android-RecyclerView-Clicks/

答案 2 :(得分:1)

您可以为特定受众设置事件Onclick:

例如:

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

答案 3 :(得分:0)

替换此代码,

        @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.v.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "CLICK : " + student.getName(), Toast.LENGTH_SHORT).show();
                }
            });

            holder.v.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    Toast.makeText(context, "CLICK : " + student.getName(), Toast.LENGTH_SHORT).show();
                    return false;
                }
            });
        }