如何在Gridview Android中保持CheckBox持久性(处理复选框状态)? [英] How to keep CheckBox persistence in Gridview Android (handling checkbox state)?
问题描述
我正在开发一个使用自定义gridview和图像的应用程序;复选框.用图像显示网格视图复选框运作良好.但是在这里,我的问题是,如果我滚动网格视图,请选中一个复选框,然后选中另一个复选框&;再次,如果我再次向下滚动它显示.此处复选框选中状态为maintaing.我的Adapterclass代码是..
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
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).
推荐答案
从上面链接中romain guy的listview解决方案得出.
Drawing from romain guy's solution of listview in the above link.
您的自定义适配器必须实现CompoundButton.OnCheckedChangeListener
并使用SparseBooleanArray
Your Custom Adapter must implement CompoundButton.OnCheckedChangeListener
and use a 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
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
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>
类似于此处回答的那个.代替listview使用gridview而不是textview使用imageview.
Similar to the one answered here. Instead of listview use gridview and instead of textview use imageview.
这篇关于如何在Gridview Android中保持CheckBox持久性(处理复选框状态)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!