我的适配器代码:
public class BrandAdapter extends RecyclerView.Adapter<BrandAdapter.BrandViewHolder> {
private static final String TAG = BrandAdapter.class.getSimpleName();
private List<BrandItem> brands;
private Context context;
public BrandAdapter(Context context, List<BrandItem> data) {
this.context = context;
this.brands = data;
}
public void setData(List<BrandItem> dataDownload) {
this.brands = dataDownload;
}
@Override
public BrandViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item_brand, null);
BrandViewHolder holder = new BrandViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(BrandViewHolder holder, int position) {
BrandItem brandItem = brands.get(position);
String name = brandItem.getName();
int count = brandItem.getCountArticles();
holder.tvName.setText(name);
if (count > 0) {
holder.tvCount.setText("" + count);
} else {
holder.tvCount.setVisibility(View.GONE);
}
}
@Override
public int getItemCount() {
return brands.size();
}
public static class BrandViewHolder extends RecyclerView.ViewHolder {
TextView tvName;
TextView tvCount;
public BrandViewHolder(View itemView) {
super(itemView);
tvName = (TextView) itemView.findViewById(R.id.tv_brand_name);
tvCount = (TextView) itemView.findViewById(R.id.tv_count_article);
}
}
}
片段代码:
recyclerView = (RecyclerView) view.findViewById(R.id.recycleView);
linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
adapter = new BrandAdapter(getActivity(), brands);
recyclerView.setAdapter(adapter);
从服务器下载品牌数据。下载完成后,我只需通过以下代码为适配器设置新数据:
brands = downloadedBrands();
adapter.setData(brands);
adapter.notifyDataSetChanged();
下载完成后第一次加载数据时一切正常。但是当我向下滚动循环视图并再次向上滚动时,每个项目的数据现在都是错误的,所有textview tvCount 都消失了。我不知道为什么。
我的代码有问题吗?
答案 0 :(得分:1)
格林罗博的答案是正确的,但这里有一个解释,为什么你有这个问题。
您假设您的视图始终设置为onBindViewHolder
方法中的默认值。
RecyclerView
重新使用滚动屏幕的视图,因此您绑定的视图可能以前已经使用过(并已更改过)。
您onBindViewHolder
方法应该始终设置一切。即所有视图都重置为您想要的确切值,并且不要假设因为您将项目默认为可见,所以它始终如此。
答案 1 :(得分:0)
设置非零计数时,请将tvCount视为可见。
if (count > 0) {
holder.tvCount.setText("" + count);
holder.tvCount.setVisibility(View.VISIBLE);
} else {
holder.tvCount.setVisibility(View.GONE);
}
看看这是否有帮助。
答案 2 :(得分:0)
您告诉如果count小于0,请隐藏视图。如果计数大于零怎么办?您没有再次显示视图。因此,只需在if条件中进行以下更改:
if (count > 0) {
holder.tvCount.setText("" + count);
holder.tvCount.setVisibility(View.VISIBLE);
} else {
holder.tvCount.setVisibility(View.GONE);
}