我有一个自定义对象:
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.Adapter
:
MyAdapter.class
public class MyAdapter extends RecyclerView.Adapter{ private Context context; private ArrayList students = new ArrayList<>(); public MyAdapter(Context mContext, ArrayList 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()
每次新项目滚动到视图时都会调用方法.因此,内部调用click监听器onBindViewHolder()
会导致其中的昂贵操作.
我该如何解决这个问题?
你需要在你的案例onClickListener()
中设置ViewHolder
ie itemView 的视图.onClick()
单击完整视图即根视图(在您的情况下为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()
在孩子看来也是如此.