如何解决如果由一行选中的复选框调用notifyDataSetChanged() 会导致循环
我有一个适配器绘制了产品列表和按产品属性分组的复选框,名为firstRefAllowGroup。
通过选中其中一个复选框,具有相同 firstRefAllowGroup 的行将保持启用,而其他行将被禁用,这意味着它们将被重新绘制以灰色文本显示,复选框的可见性设置为消失。
为了实现这一点,我使用了 checkBox.onCheckedChanged,它调用了一个 activity 方法,该方法迭代所有产品 > 并将名为 tempdisabled 的产品属性设置为 true 或 false,具体取决于 firstRefAllowGroup 的值。然后我 notifyDataSetChanged() 不幸地通过导致 onBindViewHolder->checkBox.setonCheckedchangelistener() 再次运行来创建一个循环。
长话短说:
adapter->onBindViewHolder->绘制复选框->checkBox.setonCheckedchangelistener()->activity.changeProductProperty->adapter.notifyDataSetChanged()->adapter->绘制复选框。
扩展说明:
为了执行此操作,我添加了适配器的 onBindViewHolder() checkBox.setonCheckedchangelistener() 方法。
// adapter.onBindViewHolder
// if product is tempdisabled,draw a disabled row
if (product != null && (product.istempdisabled() || product.getEnabled() == null || product.getEnabled() == false ) ) {
containerView.setAlpha((float) 0.5);
productName.setPaintFlags(productName.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
containerView.setBackgroundColor(Color.WHITE);
checkBox.setVisibility(View.GONE);
}
checkBox.setonCheckedchangelistener(new CompoundButton.OnCheckedchangelistener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked)
{
ConstraintLayout container = (ConstraintLayout) buttonView.getParent();
if (product.getEnabled() == true) {
if (isChecked) {
// customizeProductActivity is parent activity
customizeProductActivity.enableRefAllowGroupsProductsOnly(product.getFirstRefAllowGroup(),true);
} else {
customizeProductActivity.enableRefAllowGroupsProductsOnly(product.getFirstRefAllowGroup(),true);
}
}
}
});
在父活动中,我添加了根据单击复选框的 firstRefAllowGroup 属性将产品的属性“tempdisabled”设置为 true 或 false 的函数。 然后我调用 adapter.notifyDataSetChanged() 来重绘行。如果产品的 tempdisabled 为 true,则将其绘制为禁用(灰色文本,无复选框),否则将绘制为启用。
//customizeProductActivity
public void enableRefAllowGroupsProductsOnly(String refAllowGroup,Boolean checked){
//productsAdapter
Boolean doAction = true;
Boolean unDoAction = false;
if(checked == false){
doAction = false;
unDoAction = true;
}
if (this.entry.getProduct().products != null && this.entry.getProduct().products.size()>0) {
HashMap<String,HashMap<String,SelectionGroup>> groupsMap = menuObj.getGroups();
// products ordered by int id (asc)
ArrayList<ProductObj> productProductList = productRepository.getProductsInteger(this.entry.getProduct().products);
Iterator<ProductObj> it = productProductList.iterator();
while (it.hasNext()) {
ProductObj productObj = (ProductObj) it.next();
String allowedGroup = productObj.getFirstRefAllowGroup();
if(!allowedGroup.equals(refAllowGroup)){
productObj.setTempdisabled(doAction);
} else {
productObj.setTempdisabled(unDoAction);
}
}
mRecyclerView.post(new Runnable()
{
@Override
public void run() {
adapter.notifyDataSetChanged();
}
}
);
}
}
罪魁祸首来了。 notifyDataSetChanged() 将导致适配器重绘每个复选框,因此再次点击 checkBox.setonCheckedchangelistener() 方法,导致循环。
问题是: 如何通过选中其中一个复选框来启用/禁用某些行,而不会导致循环?
请让我离开这里! :-)
谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。