When recycleview scrolls parent activity, the button turns off

I have a RecyclerView grid adapter that contains checkboxes and a show button in parent activity. If we select the show checkbox parent activity show button to enable, and if we unchecked the show check button will be disabled, this is my requirement and it works fine, but when I scroll through the view mode of my show button to disable. When I scroll, I get item.isChecked()false. Can someone help me achieve my requirement please explain

 @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();
    }
}

In my pojo list class I have written two functions for the checkbox id return values

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

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

ViewHolder inner class in adapter

   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);
    }
  }
+4
source
5

, , .

@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();
    }
}
+3

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();
}

}   }

!!

+1

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);
}

,

public class MainActivity extends AppCompatActivity implements test

 @Override
    public void isChecked(boolean isChecked) {

        if(isChecked){
            // enable YOur Button here
        }else {
            // disable YOur Button here
        }
    }
+1

@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();
    }
}
+1

Thanks to everyone who helped me, I found my mistake, every time I scroll, my setOnCheckedChangeListener called, that's why my button is disabled, I added only one line: viewHolder.myCheckBox.setOnCheckedChangeListener (null); "his work is excellent. It is important for the advice and assistance of urs.

0
source

Source: https://habr.com/ru/post/1689680/


All Articles