嗨,我正在扭打一个可检查的gridView及其工作。但不是它的意图(像往常一样) 一切都像我想要的那样,只是在绘制复选框时会有延迟。
网格将变为真,但图像不会绘制,直到我检查另一个网格。同样可以通过虚假陈述取消选中。
它可能是非常简单和愚蠢的东西,但我觉得我有点盲目地盯着它。 很多坦克。 public class CheckableImageView extends ImageView implements Checkable {
private boolean mChecked=false;
public CheckableImageView(final Context context,
final AttributeSet attrs) {
super(context, attrs);
}
@Override
public void toggle() {
setChecked(!mChecked);
Toast.makeText(getBaseContext(), "toggle "+mChecked, Toast.LENGTH_SHORT)
.show();
}
@Override
public boolean isChecked() {
Toast.makeText(getBaseContext(), "checked", Toast.LENGTH_SHORT)
.show();
return mChecked;
}
@Override
public void setChecked(final boolean checked) {
if (mChecked == checked)
return;
mChecked = checked;
refreshDrawableState();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(mChecked) {
Bitmap check = BitmapFactory.decodeResource(
getResources(), R.drawable.cecked);
canvas.drawBitmap(check, 0,0, new Paint());
}
}
适配器////////////////////////////////////////////// /////////////////// 7
public class ImageAdapter extends BaseAdapter {
private Context context;
public ImageAdapter(Context c) {
context = c;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
// return randomList.size();
return 12;
}
@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 position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
CheckableImageView imageView;
if (convertView == null) {
imageView = new CheckableImageView(context, null);
imageView.setLayoutParams(new GridView.LayoutParams(240, 240));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(5, 5, 5, 5);
} else {
imageView = (CheckableImageView) convertView;
}
imageView.setImageResource(randomList.get(position));
return imageView;
}
}
OnItemClick ///////////////////////////////////////////// < / p>
@Override
public void onItemClick(AdapterView parent, View v, int position,
long id) {
cv = (CheckableImageView) v;
cv.toggle();
cv.refreshDrawableState();
}
});
答案 0 :(得分:0)
您需要致电:
notifyDataSetChanged();
更改与其相关的数据或信息时,在适配器上。这将导致Grid变为无效并根据您在适配器的getView()方法中覆盖的内容重绘。
答案 1 :(得分:0)
您可以使用ImageAdapter.getView
中的匿名类来删除大约一半的代码。
public View getView(final int position, final View convertView, final ViewGroup parent) {
final ImageView imageView;
if (convertView == null) {
imageView = new ImageView(getApplicationContext()) {
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(((GridView)parent).isItemChecked(position)) {
//...
}
}
};
} else {
imageView = (ImageView) convertView;
}
//...
}
答案 2 :(得分:0)
checkable还需要覆盖OnCreateDrawableState以实现drawable需要更改并且需要重绘。
答案 3 :(得分:0)
切换后,在onClicklistener上的imageview上调用invalidate()。工作完美,只是试了一下。