简体   繁体   中英

How to keep CheckBox persistence in Gridview Android (handling checkbox state)?

I am working on an app where i am using custom gridview with images & checkboxes. Displaying of gridview with images & checkboxes is working good. But here my issue is after make one checkbox checked if i scroll the gridview another checkbox is checked & again if i scroll down again it is displaying. Here checkbox checked state was maintaing. My Adapterclass Code is..

MyGrid.java

public class ImageAdapter extends BaseAdapter {
    private LayoutInflater mInflater;

    public ImageAdapter() {
        mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        return count;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.galleryitem, null);
            holder.imageview = (ImageView) convertView.findViewById(R.id.thumbImage);
            holder.checkbox = (CheckBox) convertView.findViewById(R.id.itemCheckBox);
            holder.textview = (TextView) convertView.findViewById(R.id.saved_image_name);

            Drawable background = holder.textview.getBackground();
            background.setAlpha(150);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.checkbox.setId(position);
        holder.imageview.setId(position);
        holder.textview.setId(position);

        holder.checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
                // TODO Auto-generated method stub
                CheckBox cb = (CheckBox) holder.checkbox;

                int id = cb.getId();

                if (thumbnailsselection[id]) {
                    cb.setChecked(false);
                    thumbnailsselection[id] = false;
                    selected_images.remove(String.valueOf(id));
                } else {
                    cb.setChecked(true);
                    thumbnailsselection[id] = true;
                    if (selected_images.contains(String.valueOf(id))) {

                    }else{
                        selected_images.add(String.valueOf(id));
                    }
                }
            }
        });

        holder.imageview.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                int id = v.getId();
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                intent.setDataAndType(Uri.parse("file://" + arrPath[id]),
                "image/*");
                startActivity(intent);
            }
        });
        if (arrPath[position] == null || arrPath[position].equals(null)) {

        }else{
        image_name=extractString(arrPath[position]);
        String[] splited_name = image_name.split("\\.");

        for (int i = 0; i < selected_images.size(); i++) {
            if (selected_images.get(i).equals(String.valueOf(position)) || selected_images.get(i) == String.valueOf(position)) {
                holder.checkbox.setChecked(true);
            }
        }

        holder.textview.setText(splited_name[0]);
        holder.imageview.setImageBitmap(thumbnails[position]);
        holder.checkbox.setChecked(thumbnailsselection[position]);
        holder.id = position;

        holder.imageview.setScaleType(ImageView.ScaleType.FIT_XY);
        }
        return convertView;
    }
}

class ViewHolder {
    ImageView imageview;
    CheckBox checkbox,checkbox1;
    TextView textview;
    int id;
}

Can anyone help me how to maintain the persistence state of checkbox (selected checkbox).

https://groups.google.com/forum/?fromgroups#!topic/android-developers/No0LrgJ6q2M

Drawing from romain guy's solution of listview in the above link.

Your Custom Adapter must implement CompoundButton.OnCheckedChangeListener and use a SparseBooleanArray

Then

 cb.setChecked(mCheckStates.get(position, false)); 
 cb.setOnCheckedChangeListener(this);

Then

     public boolean isChecked(int position) {
        return mCheckStates.get(position, false);
    }

    public void setChecked(int position, boolean isChecked) {
        mCheckStates.put(position, isChecked);

    }

    public void toggle(int position) {
        setChecked(position, !isChecked(position));
    }
@Override
public void onCheckedChanged(CompoundButton buttonView,
        boolean isChecked) {
     mCheckStates.put((Integer) buttonView.getTag(), isChecked);    

}

Example

public class MainActivity extends Activity implements
AdapterView.OnItemClickListener {
    int count;
private CheckBoxAdapter mCheckBoxAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final GridView gridView = (GridView) findViewById(R.id.lv);
    gridView.setTextFilterEnabled(true);
    gridView.setOnItemClickListener(this);
    mCheckBoxAdapter = new CheckBoxAdapter(this);
           gridView.setAdapter(mCheckBoxAdapter);

   }

public void onItemClick(AdapterView parent, View view, int
position, long id) {
    mCheckBoxAdapter.toggle(position);
}

class CheckBoxAdapter extends ArrayAdapter implements CompoundButton.OnCheckedChangeListener
{  private SparseBooleanArray mCheckStates;
   LayoutInflater mInflater;
    ImageView imageview1,imageview;
    CheckBox cb;

    CheckBoxAdapter(MainActivity context)
    {
        super(context,0);
        mCheckStates = new SparseBooleanArray(10);
        mInflater = (LayoutInflater)MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 10;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub

        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View vi=convertView;
        if(convertView==null)
         vi = mInflater.inflate(R.layout.checkbox, null); 
         imageview= (ImageView) vi.findViewById(R.id.textView1);

         cb = (CheckBox) vi.findViewById(R.id.checkBox1);

         cb.setTag(position);
         cb.setChecked(mCheckStates.get(position, false));
        cb.setOnCheckedChangeListener(this);
        return vi;
    }
     public boolean isChecked(int position) {
            return mCheckStates.get(position, false);
        }

        public void setChecked(int position, boolean isChecked) {
            mCheckStates.put(position, isChecked);

        }

        public void toggle(int position) {
            setChecked(position, !isChecked(position));
        }
    @Override
    public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {
        // TODO Auto-generated method stub
         mCheckStates.put((Integer) buttonView.getTag(), isChecked);    

    }

}

}

activity_main.xml

<RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent">
     <GridView
     android:id="@+id/lv"
     android:layout_width="wrap_content"
     android:numColumns="2"
      android:layout_height="wrap_content"
      />

    </RelativeLayout>

checkbox.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="34dp"
        android:src="@drawable/ic_launcher"/>

    <CheckBox
        android:id="@+id/checkBox1"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView1"
        android:layout_marginRight="22dp"
        android:layout_marginTop="23dp" />

</RelativeLayout>

Similar to the one answered here. Instead of listview use gridview and instead of textview use imageview.

How to change the text of a CheckBox in listview?

The cells are reused. In getView() where you are setting the id's, you should also set the state of the checkbox holder.checkbox..setChecked(thumbnailsselection[position]); . Also it isn't recommended to change the id's, if you want to save the position use setTag() and put the position there, the views already have id's in the layout.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM