这是我的自定义适配器的代码:
public static class ImageAdapter extends BaseAdapter {
private static Context mContext;
private static LayoutInflater mInflater;
// Keep all Images in array
private static Bitmap[] mThumbIds;
private static int mViewResourceId, pos;
private static CheckBox cb;
// Constructor
public ImageAdapter(Context ctx, int viewResourceId, Bitmap[] pics) {
mInflater = (LayoutInflater) ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mThumbIds = pics;
mViewResourceId = viewResourceId;
mContext = ctx;
}
@Override
public int getCount() {
return mThumbIds.length;
}
@Override
public Object getItem(int position) {
return mThumbIds[position];
}
@Override
public long getItemId(int position) {
return 0;
}
@SuppressWarnings("deprecation")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = mInflater.inflate(mViewResourceId, null);
// ImageButton imageView = (ImageButton)
// convertView.findViewById(R.id.icon);
cb = new CheckBox(mContext);
Drawable background = new BitmapDrawable(mThumbIds[position]);
cb.setBackgroundDrawable(background);
pos = position;
System.out.println("Setting checkbox set: "+imageIsDup[pos]);
cb.setChecked(imageIsDup[pos]);
System.out.println("Has checkbox been set? "+cb.isChecked());
cb.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (cb.isChecked()) {
imageIsDup[pos] = true;
} else
imageIsDup[pos] = false;
}
});
return cb;
}
}
}
我正在设置适配器:
GridView list = (GridView) dialog
.findViewById(R.id.grid_view);
TextView no = (TextView) dialog
.findViewById(R.id.noOfDups);
no.setText("Found " + noOfImages
+ " duplicates. Please verify.");
//list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
dialog.setTitle("Images Found");
dialog.setCancelable(true);
// ImageAndTextAdapter adapter = new ImageAndTextAdapter
// (longOperationContext, R.layout.row, imageNames,
// imageLocs, thumb);
ImageAdapter adapter = new ImageAdapter(
longOperationContext, R.layout.row, thumb);
System.out.println("No of images:"+thumb.length);
list.setAdapter(adapter);
如果我单击并取消选中它们,复选框就可以正常工作。什么行不通的是setChecked()
函数。虽然参数为true
,但在显示时没有设置复选框。这是什么错误?
此代码之前正在使用,我稍后进行了一些编辑,从那时起它就没有用了。我不记得编辑了。
更新的
即使只有8张图片,println
消息也应该只有16
,但48
也是imageIsDup
。第一组仅为假,后两组具有正确的{{1}}值。
答案 0 :(得分:0)
您是否调用adapter.notifyDataSetChanged()方法来通知列表刷新视图?
此外,如果您使用的是eclipse,则可以从您编辑的任何文件中查看本地历史记录(可从右键单击菜单中获取) - 也许您可以使用它来记住您所做的编辑,这改变了您的功能。 / p>
答案 1 :(得分:0)
您可以使用 onitemClickListener ,而不是在ImageAdapter类中设置复选框侦听器,这最终将为您提供正在选择的位置。所以你可以从那里更新你的 imageIsDup数组。
根据 imageIsDup的更新值
,CheckBox会自动保持选中或取消选中list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos,
long arg3) {
// TODO Auto-generated method stub
if(imageIsDup[pos] == true)
imageIsDup[pos] = false;
else
imageIsDup[pos] = true;
adapter.notifyDataSetChanged();
}
});
答案 2 :(得分:0)
我将getView
更改为:
public View getView(int position, View convertView, ViewGroup parent) {
convertView = mInflater.inflate(mViewResourceId, list, false);
// ImageButton imageView = (ImageButton)
// convertView.findViewById(R.id.icon);
cb = (CheckBox) convertView.findViewById(R.id.select);
//cb = new CheckBox(mContext);
Drawable background = new BitmapDrawable(mThumbIds[position]);
cb.setBackgroundDrawable(background);
pos = position;
System.out.println("Setting checkbox set: "+imageIsDup[pos]);
cb.setChecked(imageIsDup[pos]);
System.out.println("Has checkbox been set? "+cb.isChecked());
cb.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (cb.isChecked()) {
imageIsDup[pos] = true;
} else
imageIsDup[pos] = false;
}
});
return convertView;
}