CauCuKien
CauCuKien

Reputation: 1037

Data on recycleview item is not correct when scroll

My adapter code:

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);

        }
    }
}

Fragment code :

recyclerView = (RecyclerView) view.findViewById(R.id.recycleView);
linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);

adapter = new BrandAdapter(getActivity(), brands);
recyclerView.setAdapter(adapter);

Data for brands is downloaded from server. After downloaded finished, I just set new data for adapter by this code :

brands = downloadedBrands();
adapter.setData(brands);
adapter.notifyDataSetChanged();

Everything is Ok when data loaded for first time after the download finish. But when I scroll down the recycleview and scroll up again, data for each item is wrong now, all textview tvCount is gone. I do not know why.

Is there any problem from my code ?

Upvotes: 0

Views: 785

Answers (3)

Chintan Soni
Chintan Soni

Reputation: 25287

You told that if count is less than 0, hide the view. What if count is greater than zero ? You are not making the view visible again. So simply make the below changes in your if condition:

if (count > 0) {
        holder.tvCount.setText("" + count);
        holder.tvCount.setVisibility(View.VISIBLE);        
} else {
        holder.tvCount.setVisibility(View.GONE);
}

Upvotes: 0

Kuffs
Kuffs

Reputation: 35651

Greenrobo's answer is correct but here is an explanation as to WHY you are having this issue.

You are assuming that your view is always set to the default values in your onBindViewHolder method.

The RecyclerView re-uses views that have scrolled off screen and therefore the view you are binding to may have already been previously used (and changed).

You onBindViewHolder method should always set EVERYTHING up. i.e all views reset to the exact values you want and do not assume that because you default an item to visible, it will always be so.

Upvotes: 1

greenrobo
greenrobo

Reputation: 813

Please make tvCount visible when setting a non-zero count.

if (count > 0) {
        holder.tvCount.setText("" + count);
        holder.tvCount.setVisibility(View.VISIBLE);
    } else {
        holder.tvCount.setVisibility(View.GONE);
    }

See if this helps.

Upvotes: 0

Related Questions