在RecyclerView中,onBindViewHolder方法被调用两次的情况是正常的。第一次是在适配器创建时调用,用于初始化ViewHolder,第二次是在滚动列表时调用,用于绑定数据到ViewHolder上。
下面是一个示例代码,演示如何在onBindViewHolder方法中正确地处理数据绑定:
public class MyAdapter extends RecyclerView.Adapter {
private List mData;
public MyAdapter(List data) {
mData = data;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 创建ViewHolder
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_layout, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
// 绑定数据到ViewHolder
String item = mData.get(position);
holder.textView.setText(item);
}
@Override
public int getItemCount() {
return mData.size();
}
// 定义ViewHolder
public static class MyViewHolder extends RecyclerView.ViewHolder {
public TextView textView;
public MyViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.text_view);
}
}
}
通过上述代码,可以看到onBindViewHolder方法中只需要将数据绑定到ViewHolder上即可。在适配器的构造方法中传入数据列表,并在getItemCount方法中返回数据的大小。
注意,onBindViewHolder方法中应该避免执行耗时操作,以提升列表的滑动性能。如果需要执行耗时操作,可以考虑在后台线程中处理,并使用异步方式更新ViewHolder上的数据。