可检查的GridView

时间:2013-05-19 15:08:29

标签: java android checkbox

嗨,我正在扭打一个可检查的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();

        }
    });

4 个答案:

答案 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需要更改并且需要重绘。

请参阅Make RelativeLayout checkable

答案 3 :(得分:0)

切换后,在onClicklistener上的imageview上调用invalidate()。工作完美,只是试了一下。