【问题标题】:Checkable GridView可检查的 GridView
【发布时间】:2014-11-09 20:03:48
【问题描述】:

您好,我正在扭动一个可检查的 gridView 及其工作。但不是它的意图(像往常一样) 一切都像我想要的那样工作,只是在绘制复选框时存在延迟。

网格将变为真,但图像不会绘制,直到我检查另一个网格。取消选中 false 语句也是如此。

这可能是一件非常简单和愚蠢的事情,但我觉得我盯着它有点盲目。 许多坦克。

   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();

        }
    });

【问题讨论】:

  • 通过在 setChecked 上添加无效语句解决了这个问题。但是如果有人想评论我的菜鸟编码,请成为我的客人,这会让我更强大:)

标签: java android checkbox


【解决方案1】:

您需要致电:

notifyDataSetChanged();

当您更改与适配器相关的数据或信息时。这将导致 Grid 失效并根据您在 Adapter 的 getView() 方法中覆盖的内容重绘。

【讨论】:

  • 我已经在适配器上设置了 notifyDataDetChanged 但它什么也没做,只是在可检查的图像视图上添加无效。是不是走错路了?
  • notifyDataSetChanged();应该导致视图无效,因此使单击的一个视图无效似乎不是一个糟糕的解决方案(如果它工作正常)
【解决方案2】:

您可以通过在 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;
        }
        //...
    }

【讨论】:

    【解决方案3】:

    checkable 还需要重写 OnCreateDrawableState 以实现 drawable 需要更改并需要重绘。

    Make RelativeLayout checkable

    【讨论】:

      【解决方案4】:

      切换后在 onClicklistener 中的图像视图上调用 invalidate()。完美运行,刚刚尝试过。

      【讨论】:

        猜你喜欢
        • 2010-10-18
        • 2018-02-16
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多