Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android notifyDataSetChanged()在recyclerview上做什么?为什么每次调用notifyDataSetChanged()时它都不断添加新数据?_Android_Android Recyclerview - Fatal编程技术网

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

Android notifyDataSetChanged()在recyclerview上做什么?为什么每次调用notifyDataSetChanged()时它都不断添加新数据?,android,android-recyclerview,Android,Android Recyclerview,我正在尝试在我的recyclerview方法上实现此方法 我正确地遵循了脚本,它按照我想要的方式工作。是的,它会改变颜色,但每次我点击该项目时,它似乎都会不断添加新数据。我用的是2个回收站 我在第一个recyclerview上的方法调用了另一个方法来再次绘制recyclerview。就像我们调用第一个recyclerview时,它也调用第二个recyclerview 这是我的剧本: @Override public void onBindViewHolder(final ViewHold

我正在尝试在我的recyclerview方法上实现此方法

我正确地遵循了脚本,它按照我想要的方式工作。是的,它会改变颜色,但每次我点击该项目时,它似乎都会不断添加新数据。我用的是2个回收站

我在第一个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));
    }
}
@覆盖
公共无效onBindViewHolder(最终视图持有人,最终整型位置){
holder.viewItem.setHasFixedSize(true);
LinearLayoutManager布局管理器=新的LinearLayoutManager(上下文,LinearLayoutManager.VERTICAL,true);
holder.viewItem.setLayoutManager(layoutManager);
HoriSpacingDecoration HoriSpacingDecoration=新的HoriSpacingDecoration(Utils.convertDpToPixel(10,上下文));
支架.视图项.附加装饰(水平面装饰);
adapterChart=新的ChartItemAdapter(上下文);
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);
日志d(标签“onBindViewHolder:pembulatan”+ci);
ukuran=Integer.parseInt(mItems.get(position))/botol;
if(Integer.parseInt(mItems.get(position))%10notifyDataSetChanged()
recyclerview
上做什么

来自文档

  • 通知所有已注册的观察者数据集已更改

  • 有两类不同的数据更改事件:项更改和结构更改。项更改是指单个项的数据已更新,但未发生位置更改。结构更改是指在数据集中插入、删除或移动项

  • 意味着无论何时调用notifyDataSetChanged()它都会调用onBindViewHolder()

  • 你的第二个问题 为什么每次调用notifyDataSetChanged()时它都不断添加新数据

    因为您正在使用以下行在适配器中添加新数据
    adapterChart.addData(mitemchart);
    在BindViewHolder上的


    这意味着,无论何时调用您的
    onBindViewHolder
    ,您都是在您的
    中添加数据,当您调用notifyDataSetChanged()时,它调用的是OnBindView,而在您的on bind视图中,您是在forloop中添加数据,以便它再次添加数据

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

    声明布尔变量isAdded=false

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

    如何避免它?我只能更新我的项目外观而不是数据吗?@Iganov当你想在你的
    adapterChart
    中添加新数据时,这取决于你的要求。我终于明白了我的方法发生了什么。它不会添加新数据,但会不断添加这个行保持器。viewItem.addItemDecoration(horiSpacingDecoration);这改变了我的布局外观我假设这会不断添加新数据。结果表明,这不是添加新数据,而是添加了第二行中每个项目的边距recyclerview@NileshRathod谢谢你的回答。如果没有你的回答,我将无法在我的代码中找到错误。我也已经解决了。谢谢你的回答!