Java 可检查网格视图
嗨,我正在写一个可检查的gridView,它正在工作。但不是像往常一样的意图 一切都像我所希望的那样工作,只是当选中复选框时有一个延迟 网格将变为真,但在我检查另一个网格之前,图像不会绘制。同样的情况也适用于不勾选虚假陈述 这可能真的很简单很愚蠢,但我觉得我盯着它看有点盲目。 很多坦克Java 可检查网格视图,java,android,checkbox,Java,Android,Checkbox,嗨,我正在写一个可检查的gridView,它正在工作。但不是像往常一样的意图 一切都像我所希望的那样工作,只是当选中复选框时有一个延迟 网格将变为真,但在我检查另一个网格之前,图像不会绘制。同样的情况也适用于不勾选虚假陈述 这可能真的很简单很愚蠢,但我觉得我盯着它看有点盲目。 很多坦克 public class CheckableImageView extends ImageView implements Checkable { private boolean mChecked
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;
}
}
麦克里克/////////////////////////////////////////////
@Override
public void onItemClick(AdapterView parent, View v, int position,
long id) {
cv = (CheckableImageView) v;
cv.toggle();
cv.refreshDrawableState();
}
});
您需要拨打:
notifyDataSetChanged();
当您更改与适配器相关的数据或信息时,在适配器上。这将导致网格失效,并根据您在适配器的getView方法中覆盖的内容重新绘制网格。您可以通过在ImageAdapter.getView中使用匿名类删除大约一半的代码
可检查还需要重写OnCreateDrawableState,以实现需要更改可绘制的内容,并且需要重新绘制
请参见切换后在onClicklistener中的imageview上调用invalidate。很好用,只是试了一下 通过在setChecked上添加一个invalidate语句解决了这个问题。但是如果有人想评论我的noob编码,请随意,这会让我更强大:我在适配器上设置了notifyDataDetChanged,但除了在可检查的imageview上添加invalidate之外,它什么都没做。是不是走错了路;应该导致视图无效,因此,如果单击的一个视图工作正常,则使其无效似乎不是一个坏的解决方案
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;
}
//...
}