为什么ImageView.setAlpha()将alpha设置为GridView中的多个ImageView?

时间:2013-03-23 09:28:22

标签: android gridview listadapter

我正在实施一个允许多张照片选择的自定义图库。

我正在使用GridView一个简单的ImageAdapter类,从BaseAdapter扩展。

这是我的ImageAdapter课程:

public class ImageAdapter extends BaseAdapter {

    private LayoutInflater mInflater;

    public ImageAdapter() {
        mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        return count;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return 0;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.galleryitem, null);
            holder.imageview = (ImageView) convertView
                    .findViewById(R.id.thumbImage);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.imageview.setId(position);
        holder.imageview.setLongClickable(true);
        holder.imageview.setOnLongClickListener(new OnLongClickListener() {

            public boolean onLongClick(View arg0) {
                int id = arg0.getId();
                ImageView img = (ImageView) arg0;
                if (thumbnailsselection[id]) {
                    Log.d("PRTAG", "deselecting img with id: " + img.getId());
                    img.setBackgroundResource(R.drawable.imgview_noborder);
                    img.setAlpha(255);
                    thumbnailsselection[id] = false;
                } else {
                    Log.d("PRTAG", "selecting img with id: " + img.getId());
                    img.setAlpha(128);
                    img.setBackgroundResource(R.drawable.imgview_border);
                    thumbnailsselection[id] = true;
                }
                return true;
            }
        });

        holder.imageview.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                int id = v.getId();
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                intent.setDataAndType(Uri.parse("file://" + arrPath[id]),
                        "image/*");
                startActivity(intent);
            }
        });

        holder.imageview.setImageBitmap(thumbnails[position]);
        holder.id = position;

        return convertView;
    }
}

正确添加所有图像,onClick()方法正常工作(打开正确的图像)。

问题在于onLongClick()。我正在添加自定义背景,并在长时间点击的图片上设置alpha(128 - 选中的图像,255 - 图像未选中)。实际选择工作正常,它选择正确的图像。

实际问题是滚动网格视图时背景和alpha设置为多个(随机)图像。

有没有人经历过这样的事情?关于可能导致这种情况的任何想法?

感谢。

3 个答案:

答案 0 :(得分:2)

您的观点是可重复使用的,这意味着每次调用getView时都需要更新Alpha。不仅在LongPress上

为所有选定的图片创建ArrayList selectedImages ivar   - onLongPress添加/删除图像到selectedImages
  - 在getView方法中检查图片是否存储在列表中并根据alpha值设置

答案 1 :(得分:1)

您需要熟悉ListView次点重用概念。基本上GridView在滚动时重用视图。因此,如果您更改某些视图,那么它显然会被更改然后重复使用(直到您没有在getView()中更改它的属性)。结帐Google I/O video并提供有关ListView的更多说明,因为其中大部分也适用于GridView

因此,如果您需要具有不同属性的一些视图,那么您有两个选项:

  • 制作其他类型的观点(换句话说,使用getItemViewType()getItemViewTypeCount()并通过调用notifyDataSetChanged()动态更改类型);
  • 使用之前存储的信息存储特定项目位置(或ViewHolder中的某种标记,在您的情况下可能是thumbnailsselection数组信息)和每getView()次调用的设置视图属性;

答案 2 :(得分:1)

我建议不要在ImageView方法中使用getView()的点击和长按听众,而是使用ListViewGridView的{​​{1} }和setOnItemLongClickListener

在这些听众中,您应该只保存选定或不选择的项目状态,并且在setOnItemClickListener方法中,您应该查找项目的状态并执行以下操作:

getView()

基本上,在每个 if (thumbnailsselection[id]) { Log.d("PRTAG", "deselecting img with id: " + img.getId()); img.setBackgroundResource(R.drawable.imgview_noborder); img.setAlpha(255); } else { Log.d("PRTAG", "selecting img with id: " + img.getId()); img.setAlpha(128); img.setBackgroundResource(R.drawable.imgview_border); } 调用中,您应该验证数据对象状态,始终调整视图的状态,然后再返回。