首页 > 解决方案 > 如何在 RecyclerView 中汇总检查项目数据值

问题描述

我的问题是如何汇总所有检查项目的值,以及如何在检查/取消检查事件中管理它们的更改?这是我的复选框切换(选中/取消选中)事件的方法。

holder.itemCheckBox.setOnClickListener(new View.OnClickListener() 
{
  @Override
  public void onClick(View v) 
  {
    if (((CheckBox) v).isChecked()) 
    {
      double price = Double.parseDouble(catalogDatabases.get(position).getPriceItem());
      holder.totalPrice = holder.totalPrice + price;
      holder.listener.respond(holder.totalPrice);
    } 
    else {
    }
  }
});

标签: javaandroidandroid-studio

解决方案


所以首先不要依赖视图作为数据。我会在你的代码中解释

if (((CheckBox) v).isChecked())

您依赖视图的 isChecked 方法。由于android列表回收机制,这可能会导致错误。

您可以在下面的链接中了解它
ListView 的回收机制是如何工作的

TL;DR 视图正在被回收,因此当您滚动列表时。因此,例如,用户检查了项目编号 3,然后向下滚动列表,例如项目编号 13 也可能显示为已检查,即使它不是。

因此,当 onClick 触发时,我们需要将选中状态保存在某个列表中

在理论介绍之后,我将在代码中展示它。

//Here you'll need to create some boolean array or list to store
//checked not checked positions lets call it checked
boolean[] checkedArr = new boolean[catalogDatabases.size()];
// catalogDatabases.size represents your data set size
// note that all items will be false initially

    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
        /**
         * Other views binding.......
         */
        holder.itemCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
                checkedArr[position] = isChecked;
                sumAllCheckedAndNotify();
            }
        }
        );
    }

(我决定在每次检查时都进行计算,以便更直接地更新事件)

    private void sumAllCheckedAndNotify() {
        double sum = 0;
        for (int i = 0; i < checkedArr.length; i++) {
            if(checkedArr[i]) {
                sum += Double.parseDouble(catalogDatabases.get(i).getPriceItem());
            }
        }
        // pudate the listener
        listener.respond(sum, selectedCount);
    }

推荐阅读