java - 如何在 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 {
}
}
});
解决方案
所以首先不要依赖视图作为数据。我会在你的代码中解释
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);
}
推荐阅读
- python-3.x - 如何使用 seaborn factorplot 绘制多个图?
- javascript - 如何将字符串从php传递给js
- system-verilog - 如何从与系统verilog中的函数同名的函数返回一个数组?
- assembly - 汇编:将输入与字符串进行比较
- mysql - MySQL在返回的一组记录中查询相同数量的状态
- php - XML 中的 PHP - 解析错误:文档末尾的额外内容
- julia - 使矩阵的行或列全为零 [Julia]
- html - 如何修复我的导航栏以使其居中并使其在两侧均匀?
- unity3d - Unity-如何通过触摸输入移动?
- xaml - 除非禁用 XBF,否则 XAML 解析异常