Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Gridview Android中保持复选框持久性(处理复选框状态)?_Java_Android_Checkbox_Persistence_Android Gridview - Fatal编程技术网

Java 如何在Gridview Android中保持复选框持久性(处理复选框状态)?

Java 如何在Gridview Android中保持复选框持久性(处理复选框状态)?,java,android,checkbox,persistence,android-gridview,Java,Android,Checkbox,Persistence,Android Gridview,我正在开发一个应用程序,我正在使用带有图像和复选框的自定义gridview。显示带有图像和复选框的gridview效果良好。但这里我的问题是,如果我滚动gridview,选中一个复选框,另一个复选框被选中&如果我再次向下滚动,它将再次显示。此处复选框选中状态为维护。我的适配器类代码是 MyGrid.java public class ImageAdapter extends BaseAdapter { private LayoutInflater mInflater; publ

我正在开发一个应用程序,我正在使用带有图像和复选框的自定义gridview。显示带有图像和复选框的gridview效果良好。但这里我的问题是,如果我滚动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;
}
公共类ImageAdapter扩展了BaseAdapter{
私人停车场;
公共映像适配器(){
mInflater=(LayoutInflater)getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
}
public int getCount(){
返回计数;
}
公共对象getItem(int位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
最终持票人;
if(convertView==null){
holder=新的ViewHolder();
convertView=mInflater.充气(R.layout.galleryitem,空);
holder.imageview=(imageview)convertView.findViewById(R.id.thumbImage);
holder.checkbox=(checkbox)convertView.findViewById(R.id.itemCheckBox);
holder.textview=(textview)convertView.findViewById(R.id.saved\u image\u name);
Drawable background=holder.textview.getBackground();
背景:setAlpha(150);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
holder.checkbox.setId(位置);
支架.imageview.setId(位置);
holder.textview.setId(位置);
setOnCheckedChangeListener(新的OnCheckedChangeListener(){
@凌驾
已更改复选框时的公共无效(复合按钮arg0,布尔值arg1){
//TODO自动生成的方法存根
复选框cb=(复选框)holder.CheckBox;
int id=cb.getId();
如果(缩略图选择[id]){
cb.setChecked(假);
thumbnailsselection[id]=false;
选中的_图像。删除(String.valueOf(id));
}否则{
cb.setChecked(真);
thumbnailsselection[id]=真;
if(所选的_images.contains(String.valueOf(id))){
}否则{
选中的_图像。添加(String.valueOf(id));
}
}
}
});
holder.imageview.setOnClickListener(新的OnClickListener(){
公共void onClick(视图v){
//TODO自动生成的方法存根
int id=v.getId();
意图=新意图();
intent.setAction(intent.ACTION\u视图);
intent.setDataAndType(Uri.parse(“文件:/”+arrPath[id]),
“图像/*”;
星触觉(意向);
}
});
if(arrPath[position]==null | | arrPath[position].equals(null)){
}否则{
image_name=extractString(arrPath[position]);
String[]splited\u name=image\u name.split(“\\”);
对于(int i=0;i

有人能帮我维护复选框(选中复选框)的持久性状态吗

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

从上面链接中romain guy的listview解决方案中提取

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

然后

然后

范例

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


是否要选中该复选框以在滚动时保持状态?假设在上下滚动时选中了第一行的复选框(只选中了第一行的复选框)。这就是您要寻找的吗?是的。我正是在寻找解决方案。您对代码的哪一部分感到困惑?请在编辑之前查看代码。您应该能够通过查看示例进行修改。您对哪一部分感到困惑?
<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>
<?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>