使用光标适配器时,我无法找到保存复选框状态的方法.其他一切工作正常,但如果我点击一个复选框,它会被重复使用.我见过使用数组适配器的例子,但由于我缺乏经验,我发现很难将其转换为使用游标适配器.有人可以给我一个如何去做的例子.任何帮助赞赏.
private class PostimageAdapter extends CursorAdapter {
private static final int s = 0;
private int layout;
Bitmap bm=null;
private String PostNumber;
TourDbAdapter mDbHelper;
public PostimageAdapter (Context context,int layout,Cursor c,String[] from,int[] to,String Postid) {
super(context,c);
this.layout = layout;
PostNumber = Postid;
mDbHelper = new TourDbAdapter(context);
mDbHelper.open();
}
@Override
public View newView(Context context,final Cursor c,ViewGroup parent) {
ViewHolder holder;
LayoutInflater inflater=getLayoutInflater();
View row=inflater.inflate(R.layout.image_post_row,null);
holder = new ViewHolder();
holder.Description = (TextView) row.findViewById(R.id.item_desc);
holder.cb = (CheckBox) row.findViewById(R.id.item_checkBox);
holder.DateTaken = (TextView) row.findViewById(R.id.item_date_taken);
holder.Photo = (ImageView) row.findViewById(R.id.item_thumb);
row.setTag(holder);
int DateCol = c.getColumnIndex(TourDbAdapter.KEY_DATE);
String Date = c.getString(DateCol);
int DescCol = c.getColumnIndex(TourDbAdapter.KEY_CAPTION);
String Description = c.getString(DescCol);
int FileNameCol = c.getColumnIndex(TourDbAdapter.KEY_FILENAME);
final String FileName = c.getString(FileNameCol);
int PostRowCol = c.getColumnIndex(TourDbAdapter.KEY_Post_ID);
String RowID = c.getString(PostRowCol);
String Path = "sdcard/Tourabout/Thumbs/" + FileName + ".jpg";
Bitmap bm = BitmapFactory.decodeFile(Path,null);
holder.Photo.setimageBitmap(bm);
holder.DateTaken.setText(Date);
holder.Description.setText(Description);
holder.cb.setonClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
CheckBox cBox = (CheckBox) v;
if (cBox.isChecked()) {
mDbHelper.UpdatePostimage(FileName,PostNumber);
}
else if (!cBox.isChecked()) {
mDbHelper.UpdatePostimage(FileName,"");
}
}
});
return row;
};
@Override
public void bindView(View row,Context context,final Cursor c) {
ViewHolder holder;
holder = (ViewHolder) row.getTag();
int DateCol = c.getColumnIndex(TourDbAdapter.KEY_DATE);
String Date = c.getString(DateCol);
int DescCol = c.getColumnIndex(TourDbAdapter.KEY_CAPTION);
String Description = c.getString(DescCol);
int FileNameCol = c.getColumnIndex(TourDbAdapter.KEY_FILENAME);
final String FileName = c.getString(FileNameCol);
int PostRowCol = c.getColumnIndex(TourDbAdapter.KEY_Post_ID);
String RowID = c.getString(PostRowCol);
String Path = "sdcard/Tourabout/Thumbs/" + FileName + ".jpg";
Bitmap bm = BitmapFactory.decodeFile(Path,null);
File x = null;
holder.Photo.setimageBitmap(bm);
holder.DateTaken.setText(Date);
holder.Description.setText(Description);
holder.cb.setonClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
CheckBox cBox = (CheckBox) v;
if (cBox.isChecked()) {
mDbHelper.UpdatePostimage(FileName,PostNumber);
}
else if (!cBox.isChecked()) {
mDbHelper.UpdatePostimage(FileName,"");
}
}
});
}
}
static class ViewHolder{
TextView Description;
ImageView Photo;
CheckBox cb;
TextView DateTaken;
}
}
解决方法
我建议你使用Android内置的多选列表支持(CHOICE_MODE_MULTIPLE).
List11.java SDK示例演示了这一点.您还可以从我的一个使用它的教程中找到一个项目here.
你仍然可以在你自己的布局中使用这种技术,只要你在android.R.layout.simple_list_item_multiple_choice资源中包含一个带有android:id =“@ android:id / text1”的CheckedTextView,其副本随附你的SDK.
另请参见this question和this question以及this question和this question.