滚动时,recycleview项目上的数据不正确

时间:2016-03-04 15:46:31

标签: android android-recyclerview

我的适配器代码:

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 都消失了。我不知道为什么。

我的代码有问题吗?

3 个答案:

答案 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);
}