我有以下用于 RecyclerView.Adapter
类的代码,它运行良好:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.Viewholder> {
private List<Information> items;
private int itemLayout;
public MyAdapter(List<Information> items, int itemLayout){
this.items = items;
this.itemLayout = itemLayout;
}
@Override
public Viewholder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(itemLayout, parent, false);
return new Viewholder(v);
}
@Override
public void onBindViewHolder(Viewholder holder, final int position) {
Information item = items.get(position);
holder.textView1.setText(item.Title);
holder.textView2.setText(item.Date);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "Recycle Click" + position, Toast.LENGTH_SHORT).show();
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Toast.makeText(v.getContext(), "Recycle Click" + position, Toast.LENGTH_SHORT).show();
return true;
}
});
}
@Override
public int getItemCount() {
return items.size();
}
public class Viewholder extends RecyclerView.ViewHolder {
public TextView textView1;
public TextView textView2;
public Viewholder(View itemView) {
super(itemView);
textView1=(TextView) itemView.findViewById(R.id.text1);
textView2 = (TextView) itemView.findViewById(R.id.date_row);
}
}
}
然而,我认为在onBindViewHolder
方法中实现OnClickListener是一种不好的做法。这是为什么,有更好的替代方案吗?
onCreateViewHolder()
只会被调用一次(每个 ViewHolder),所以你是在 ViewHolder 构造函数中实现它还是在onCreateViewHolder()
中实现它,这取决于你个人的喜好。我已经养成了把它放在 VH 中的习惯,但你应该做你认为最易读且有助于你未来理解的事情。只要像 brucelet 建议的那样避免使用onBindViewHolder()
以提高性能即可。 - AdamMc331onCreateViewHolder()
中完成,而不是在ViewHolder
构造函数中完成,这样我可以将我的ViewHolder
类设为static
,而不需要将适配器的引用传递给ViewHolder
。但这主要是一种风格选择,因为onCreateViewHolder()
和new ViewHolder()
应该有一对一的对应关系。 - RussHWolfgetAdapterPosition()
。请参见我链接的答案。除非我误解了你的意思? - AdamMc331