我正在尝试在自己的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()时,它也调用了适配器来添加数据。我被卡住了,不知道该怎么办。也许任何人都可以为我找到解决方案。
答案 0 :(得分:3)
notifyDataSetChanged()
对recyclerview
有什么作用?
来自文档
通知所有注册观察者该数据集已更改。
数据更改事件有两种不同的类别,即项目更改和结构更改。物料更改是指单个物料的数据已更新但未发生位置更改的情况。结构更改是指在数据集中插入,删除或移动项目的时间。
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;
}