微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果由一行选中的复选框调用notifyDataSetChanged() 会导致循环

如何解决如果由一行选中的复选框调用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 举报,一经查实,本站将立刻删除。