notifyDataSetChanged()在recyclerview上做什么?为什么每次我调用notifyDataSetChanged()时都会不断添加新数据?

时间:2018-09-21 03:59:53

标签: android android-recyclerview recycler-adapter

我正在尝试在自己的recyclerview方法Changing background color of selected item in recyclerview

上实现此方法

我正确地遵循了脚本,并且可以按照我想要的方式工作。是的,它会更改颜色,但是每次我单击该项目时,似乎都在不断添加新数据。我正在使用2个recyclerview。

我在第一个recyclerview上的方法调用了另一个方法来再次绘制recyclerview。就像当我们调用第一个recyclerview时一样,它也调用了第二个recyclerview。

这是我的脚本:

    @Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    holder.viewItem.setHasFixedSize(true);
    LinearLayoutManager layoutManager = new LinearLayoutManager(context,LinearLayoutManager.VERTICAL,true);
    holder.viewItem.setLayoutManager(layoutManager);

    HoriSpacingDecoration horiSpacingDecoration = new HoriSpacingDecoration(Utils.convertDpToPixel(10,context));
    holder.viewItem.addItemDecoration(horiSpacingDecoration);

    adapterChart = new ChartItemAdapter(context);
    holder.viewItem.setAdapter(adapterChart);

    mItemsChart.clear();

        holder.textView.setText(mBulan.get(position));
        int dataTertinggi = Integer.parseInt(Collections.max(mItems));
        int botol = dataTertinggi/5;
        int ci = niceround(dataTertinggi);
        Log.d(TAG, "onBindViewHolder: pembulatan " + ci);
            ukuran = Integer.parseInt(mItems.get(position))/botol;

            if(Integer.parseInt(mItems.get(position))%10 < botol)
            {
                ukuran2=1;
                ukuran+=ukuran2;
            }
            else
            {
                ukuran2=1;
                ukuran+=ukuran2;
            }

        for(int y=0;y<ukuran;y++)
        {
            mItemsChart.add(String.valueOf(y));
        }
        adapterChart.addData(mItemsChart);

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(context,mItems.get(position) + " Bottle" ,Toast.LENGTH_SHORT).show();

                prevPos = position;
                mItemsChart.clear();
                notifyDataSetChanged();
            }
        });
    if(prevPos == position)
    {
        holder.textView.setTextColor(context.getResources().getColor(R.color.colorPrimary));
    }
    else
    {
        holder.textView.setTextColor(context.getResources().getColor(R.color.colorAccent));
    }
}

我已经发现问题是当我调用notifydatasethaschanged()时,它也调用了适配器来添加数据。我被卡住了,不知道该怎么办。也许任何人都可以为我找到解决方案。

2 个答案:

答案 0 :(得分:3)

您的第一个问题

  

notifyDataSetChanged()recyclerview有什么作用?

来自文档

notifyDataSetChanged

  1. 通知所有注册观察者该数据集已更改。

  2. 数据更改事件有两种不同的类别,即项目更改和结构更改。物料更改是指单个物料的数据已更新但未发生位置更改的情况。结构更改是指在数据集中插入,删除或移动项目的时间。

  3. 表示您每次呼叫notifyDataSetChanged()时都会呼叫 onBindViewHolder()

您的第二个问题

  

为什么每次我调用notifyDataSetChanged()时它都会不断添加新数据?

因为您正在使用以下行在 adapterChart 中添加新数据   {strong> adapterChart.addData(mItemsChart);

中的onBindViewHolder

这意味着每当调用 onBindViewHolder 时,您都将数据添加到 adapterChart

答案 1 :(得分:0)

当您调用notifyDataSetChanged()时,它会调用OnBindView吗?在绑定视图中,您正在forloop中添加数据,因此它会再次添加数据

您可以做一件事来克服这个问题

声明一个布尔型变量iwego = false;

 if(!isAdded){
    //your for loop here 
    //add data here
   //and make isAdded true
    isAdded = true; 
   }