设置项目点击监听器里onBindViewHolder()与RecyclerView.Adapter [英] Set on item click listener inside onBindViewHolder() with RecyclerView.Adapter

查看:3719
本文介绍了设置项目点击监听器里onBindViewHolder()与RecyclerView.Adapter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个自定义对象:

Student.class

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适配器是这样的:

Then i implement RecyclerView Adapter like this :

MyAdapter.class

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持有人。

As you can see in onBindViewHolder(), i set ItemClickListener for holder.

@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()会导致内它昂贵的操作。

But i know onBindViewHolder() method will be called every time a new item scrolls into view. So call click listener inside onBindViewHolder() causes expensive operations inside it.

我怎样才能解决这个问题呢?

How can i resolve this problem ?

推荐答案

您需要在onClickListener呼吁ViewHolder ItemView控件,即在你的情况的看法。它会立即调用的onClick()方法,您单击完整视图,即根视图(ItemView控件你的情况)

you need to call on onClickListener on the view of the ViewHolder i.e. itemView in your case. It will call the onClick() method as soon as you click the complete view i.e. root view(itemView in your case)

您还可以设置onClickListener上的根,即姓名和年龄的孩子的。

you can also set onClickListener on the childs of the root i.e. name and age.

里面ViewHolder(查看ItemView控件)构造函数:

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

                }
            });

同样你也可以拨打onLongClickListner。
和name.setOnClickLisner()的子视图了。

Similarly you can call onLongClickListner also. And name.setOnClickLisner() on child view too.

这篇关于设置项目点击监听器里onBindViewHolder()与RecyclerView.Adapter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆