【问题标题】:When recycleview scrolling parent activity button go disable [duplicate]当recyclerview滚动父活动按钮禁用[重复]
【发布时间】:2017-11-22 10:13:20
【问题描述】:

我有一个 RecyclerView 网格适配器,在父活动中包含复选框和一个显示按钮。如果我们选择复选框父活动显示按钮启用并且如果我们未选中复选框显示按钮将禁用,这就是我的要求,它工作正常,但是当我滚动回收视图时,我的显示按钮禁用。当我滚动时,我得到item.isChecked() 是假的。任何人都可以帮我实现我的要求,请解释一下

 @Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    try {
        final GridViewHolder viewHolder = (GridViewHolder) holder;

        final MyList item = items.get(position);

        viewHolder.myCheckBox.setTag(position);
        viewHolder.myCheckBox.setOnCheckedChangeListener(new 
   CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, 
    boolean b) {

                item.setChecked(b);

                if (item.isChecked())
                   Count++;
                else
                  Count--;

                if (Count > 0) {

                    ((MyActivity)context).showButton().setEnabled(true);

                } else {
                    ((MyActivity)context).showButton().setEnabled(false);
                }


        }
        });

        viewHolder.myCheckBox.setChecked(item.isChecked());


    } catch (Exception e) {
        e.printStackTrace();
    }
}

在我的 pojo 列表类中,我为身份复选框返回值编写了两个函数

  boolean isChecked;
  public boolean isChecked() {
    return isChecked;
  }

public void setChecked(boolean isChecked) {
    this.isChecked = isChecked;
}

适配器中的 ViewHolder 内部类

   public class GridViewHolder extends RecyclerView.ViewHolder {


    private CheckBox myCheckBox;


     public GridViewHolder(final View parent) {
        super(parent);

        myCheckBox = (CheckBox) parent.findViewById(myCheckBox);

       ((ProductListingActivity)context).showButton().setEnabled(false);

        parent.setOnClickListener(GridAdapterMy.this);
    }
  }

【问题讨论】:

  • 我告诉过你需要保存复选框的状态我的朋友
  • 请问你能发给我任何代码示例吗,请看我的代码
  • 等我分享给你一个代码
  • 亲爱的朋友我真的不明白,我是初学者,我必须在哪里放置 dis 代码?在 onbindviewholder 或 ViewHolder 中?实际上我在主要活动中使用分页,所以每次 recyclerview 滚动 api 调用都会发生并将新数据添加到列表中。我的复选框状态仍然稳定,只显示按钮状态变化
  • 查看我的回答删除 setOnCheckedChangeListener 并使用 setOnClickListener。

标签: java android checkbox android-recyclerview


【解决方案1】:

我遇到了和你一样的问题,我就是这样解决的。

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    try {
        final GridViewHolder viewHolder = (GridViewHolder) holder;

        viewHolder.myCheckBox.setTag(position);

        //add this two lines 
        viewHolder.myCheckBox.setOnCheckedChangeListener(null);
        viewHolder.myCheckBox.setChecked(items.get(position).isChecked());

        viewHolder.myCheckBox.setOnCheckedChangeListener(new 
            CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton,boolean b) {


                items.get(position).setChecked(b);

                if (items.get(position).isChecked())
                   Count++;
                else
                  Count--;

                if (Count > 0) {
                   ((MyActivity)context).showButton().setEnabled(true);
                } else {
                   ((MyActivity)context).showButton().setEnabled(false);
                }}
        });

    } catch (Exception e) {
        e.printStackTrace();
    }
}

【讨论】:

  • 谢谢你,但在我的情况下它不起作用
  • 在将侦听器分配给您的视图之前是否已输入此 viewHolder.myCheckBox.setOnCheckedChangeListener(null); viewHolder.myCheckBox.setChecked(item.isChecked());
  • 当我再次向下滚动时,按钮可见性变为禁用。
  • 只需从上面发布的答案中复制onBindViewHolder() 1件事
  • @user8737536 我已经更新了答案,再试一次。
【解决方案2】:

试试这段代码

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    try {
        final GridViewHolder viewHolder = (GridViewHolder) holder;

        final MyList item = items.get(position);

        viewHolder.myCheckBox.setTag(position);

        //add this two lines 
//        viewHolder.myCheckBox.setOnCheckedChangeListener(null);
        viewHolder.myCheckBox.setChecked(item.isChecked());
        viewHolder.myCheckBox.setTag(position);
        viewHolder.myCheckBox.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                int pos = Integer.parseInt(v.getTag().toString().trim());

                items.get(pos).setChecked(b);
                if(items.get(pos).isChecked()){
                    items.get(pos).setChecked(false);
                }else{
                    items.get(pos).setChecked(true);
                }

                if (items.get(pos).isChecked())
                   Count++;
                else
                  Count--;

                if (Count > 0) {
                   ((MyActivity)context).showButton().setEnabled(true);
                } else {
                   ((MyActivity)context).showButton().setEnabled(false);
                }
                });

    } catch (Exception e) {
        e.printStackTrace();
    }
}

【讨论】:

    【解决方案3】:

    在你的 POJO 类中创建一个额外的变量:

    public class DataItems {   
    
        int id, price, qty;
        String title;
    
        boolean isChecked; // create boolean variable like this
    
        public boolean isChecked() {
            return isChecked;
        }
    
        public void setChecked(boolean checked) {
            isChecked = checked;
        }
    
    }
    

    然后,在您的适配器中添加如下代码:

    @Override
        public void onBindViewHolder(final ViewHolder holder, final int position) {
    
            // check here the state of your check from your arraylist of POJO
            if (dataItemsArrayList.get(position).isChecked) {
                holder.chkBox.setChecked(true);               
            } else {
                holder.chkBox.setChecked(false);
            }
    
            holder.tvTitle.setText(dataItemsArrayList.get(position).getTitle() + "");
            holder.tvPrice.setText(dataItemsArrayList.get(position).getPrice() + "");
            holder.tvQTY.setText(dataItemsArrayList.get(position).getQty() + "");
            holder.chkBox.setTag(position);
    
            holder.chkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    // save here the state of your check box when your select or unSelect the Checkbox
                    if (isChecked) {
    
                        ((MainActivity)context).isChecked(true);
                        holder.chkBox.setChecked(true);
                        dataItemsArrayList.get(position).setChecked(true);
    
    
                    } else {
                        ((MainActivity)context).isChecked(false);
                        holder.chkBox.setChecked(false);
                        dataItemsArrayList.get(position).setChecked(false);
                    }
    
                }
            });
    
    }
    

    编辑

    创建一个新的Interface,如下所示

    public interface test {
    
        public void isChecked(boolean isChecked);
    }
    

    现在像这样在您的 Activity 中实现

    public class MainActivity extends AppCompatActivity implements test
    

    比将此活动上下文作为参数传递给您的适配器

    在您的活动中添加此代码

     @Override
        public void isChecked(boolean isChecked) {
    
            if(isChecked){
                // enable YOur Button here
            }else {
                // disable YOur Button here
            }
        }
    

    【讨论】:

    • 谢谢你,让我试试
    • 欢迎@user8737536 如果有任何疑问请告诉我
    • 实际上在我的代码中能够保持复选框状态,我的显示按钮有问题..请准备好我的问题
    • 如前所述使用界面
    • @user8737536 检查更新我的朋友
    【解决方案4】:

    在滚动onBindViewHolder 时重复调用,这就是复选框状态自动更改的原因。因此您必须在滚动时保存复选框的状态。 看看吧。

        public class MyListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    
           private final boolean[] mCheckedState;
           private final Context mContext;
           private CheckBox result;
    
        public MyListAdapter(Context context, int resource, int textViewResourceId, List<Object> objects) {
            super(context, resource, textViewResourceId, objects);
            mCheckedState = new boolean[objects.size()];
            mContext = context;
        }
    
      @Override 
     public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
       try {
        final GridViewHolder viewHolder = (GridViewHolder) holder;
        viewHolder.myCheckBox.setTag(position);
    
        //add this two lines 
        viewHolder.myCheckBox.setOnCheckedChangeListener(null);       
        result =  viewHolder.myCheckBox;
        if (result == null) {
            result = new CheckBox(mContext);
        }
        result.setChecked(mCheckedState[position]);
        viewHolder.myCheckBox.setOnCheckedChangeListener(new 
            CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton,boolean b) {
    
                 if(b){
                    result.setChecked(mCheckedState[position]);
                      }
        });
    
    } catch (Exception e) {
        e.printStackTrace();
    }
    

    } }

    编码愉快!!

    【讨论】:

    • 谢谢你,让我试试
    • hai 这里的增值税是 "CheckBox result = (CheckBox)convertView;" ,什么是convertview?
    • 我更新了代码。请尝试一下。
    • 不能用方法void返回类型返回值,我把你的代码放在onbind里面,它的void方法
    • 你能更新我的代码吗?
    【解决方案5】:

    感谢所有帮助我的人,我发现了我的错误,每次滚动时,我的 setOnCheckedChangeListener 都会调用,这就是我的按钮禁用的原因,我只添加了一行“viewHolder.myCheckBox.setOnCheckedChangeListener(null);”它工作得很好......非常感谢你的建议和帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多