【问题标题】:How to keep CheckBox persistence in Gridview Android (handling checkbox state)?如何在 Gridview Android 中保持 CheckBox 持久性(处理复选框状态)?
【发布时间】:2013-06-19 17:51:35
【问题描述】:

我正在开发一个应用程序,我在其中使用带有图像和复选框的自定义网格视图。显示带有图像和复选框的网格视图效果很好。但是这里我的问题是,如果我滚动gridview,选中一个复选框,如果我再次向下滚动,它会再次选中另一个复选框。此处复选框选中状态保持不变。我的适配器类代码是..

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

谁能帮助我如何保持复选框(选中复选框)的持久性状态。

【问题讨论】:

  • 您希望选中复选框以在滚动时保持状态?假设第一行的复选框(在您向上和向下滚动时仅选中第一行的复选框。这是您要查找的内容吗?
  • 是的.. 正是我正在寻找那个解决方案。
  • 您对代码的哪一部分感到困惑?

标签: java android checkbox persistence android-gridview


【解决方案1】:

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

借鉴以上链接中 romain guy 的 listview 解决方案。

您的自定义适配器必须实现 CompoundButton.OnCheckedChangeListener 并使用 SparseBooleanArray

然后

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

然后

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

}

例子

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>

与此处回答的类似。用gridview代替listview,用imageview代替textview。

How to change the text of a CheckBox in listview?

【讨论】:

  • 在编辑前查看代码。您应该能够修改查看示例。你对哪一部分感到困惑?
【解决方案2】:

细胞被重复使用。在您设置 id 的getView() 中,您还应该设置复选框holder.checkbox..setChecked(thumbnailsselection[position]); 的状态。另外不建议更改id,如果要保存位置使用setTag()并将位置放在那里,视图已经在布局中具有id。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多