如何在Android中单击的GridView项目上设置背景可绘制?

我有一个带有一堆图标的GridView,我需要选择一个.选择我的意思是:

>我需要将drawable id存储到数据库中(以后我可以访问它)
>我需要在网格上绘制某种视觉提示,让用户知道当前选择了哪个图标

我找到了这个:
http://groups.google.com/group/android-developers/browse_thread/thread/f08a58167dbaa8c8

所以我猜setSelection不在图片中,我不能用它来选择图标本身,也不能画出视觉提示.我知道onItemClickListener中的网格项位置,我可以将其保存为私有类变量.我最大的问题是绘制视觉提示.

我怎样才能做到这一点?如何在点击的项目上绘制视觉提示,如果用户点击不同的项目,则“展开”该视觉提示并在新项目中重绘它?

解决方法:

经过几个小时的处理后,我想我终于找到了我想要的解决方案.尽管答案几乎没有关联,但Ian解决方案的初始编辑帮助我找到了这个解决方案:)

我不会解释我所做的一切,我认为这是非常自我解释的.只是几点评论:

>首先我尝试了view.Invalidate()和view.postInvalidate()而不是iconAdapter.notifyDataSetChanged(),但都没有工作.文档指出,无效方法仅“请求”在可能的情况下重新绘制视图.
>我正在寻找一个比合并两个drawable更简单的解决方案.例如,在ImageView背景上绘制图标,将视觉提示绘制为图像.出于某些奇怪的原因,当滚动GridView时,视觉提示开始随机显示其他所有图标.我不明白为什么,但在背景图像上的视觉提示的想法对我来说非常有意义,而ImageView允许这样做,不需要额外的合并方法.但是,如果没有它我就无法工作……

MyActivity.java

public class MyActivity extends Activity {
    private GridView mGridViewIcon;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mGridViewIcon = (GridView)findViewById(R.id.gridview_icon);
        mGridViewIcon.setAdapter(new IconAdapter(this));

        mGridViewIcon.setOnItemClickListener(new GridView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                IconAdapter iconAdapter = (IconAdapter)parent.getAdapter();

                iconAdapter.setSelectedItemPosition(position);
                iconAdapter.notifyDataSetChanged();
            }

        });
    }

}

IconAdapter.java

public class IconAdapter extends BaseAdapter {

    private int mSelectedPosition;
    private Integer[] mThumbIds;
    private int mIconSize;
    private Context mContext;

    public IconAdapter(Context context) {
        mThumbIds = AppHelper.ICON_SET.keySet().iterator().next();
        mIconSize = context.getResources().getDimensionPixelSize(R.dimen.default_icon_size);
        mContext = context;
    }

    @Override
    public int getCount() {
        return mThumbIds.length;
    }

    @Override
    public Object getItem(int position) {
        return mContext.getResources().getDrawable(mThumbIds[position]);
    }

    @Override
    public long getItemId(int position) {
        return mThumbIds[position];
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;

        if(convertView == null) {
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(mIconSize, mIconSize));
        } else {
            imageView = (ImageView)convertView;
        }

        if(mSelectedPosition == position) {
            imageView.setImageDrawable(mergeDrawableLayers(mThumbIds[position],
                    R.drawable.ic_note_selected_mark));
        } else {
            imageView.setImageResource(mThumbIds[position]);
        }

        return imageView;
    }

    public void setSelectedItemPosition(int position) {
        mSelectedPosition = position;
    }

    private Drawable mergeDrawableLayers(int background, int overlay) {
        Drawable[] drawableLayers = new Drawable[2];

        drawableLayers[0] = mContext.getResources().getDrawable(background);
        drawableLayers[1] = mContext.getResources().getDrawable(overlay);

        return new LayerDrawable(drawableLayers);
    }

}
上一篇:java – 无法在ListView上的自定义ArrayAdapter中获取Selected Item Index


下一篇:MVVM Master-Detail导航