0

我正在实现一个允许多张照片选择的自定义画廊。

我正在使用GridView一个ImageAdapterBaseAdapter.

这是我的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 设置为多个(随机)图像。

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

谢谢。

4

3 回答 3

2

您的视图是可重用的,这意味着您需要在每次getView调用时更新 alpha。不仅在 LongPress 上

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

于 2013-03-23T09:44:34.153 回答
1

您需要熟悉ListView视图重用概念。基本上GridView在滚动时重用视图。因此,如果您更改了某些视图,那么它显然会被更改然后重用(直到您没有更改它的属性getView())。查看Google I/O 视频,了解更多关于 的解释ListView,因为其中大部分也适用于GridView

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

  • 制作另一种类型的视图(换句话说,使用getItemViewType()getItemViewTypeCount()并通过调用动态更改类型notifyDataSetChanged());
  • 存储特定项目的位置(或某种标志ViewHolder,在您的情况下,它可能是thumbnailsselection数组信息)并getView()使用存储的信息设置每次调用的视图属性;
于 2013-03-23T09:39:33.283 回答
1

我建议不要ImageView在方法中使用 's click 和 long click 监听getView()器,而是使用ListView's or GridView's setOnItemLongClickListenerand 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);
            }

基本上,在每次getView()调用中,您都应该验证您的数据对象状态,并在返回之前始终调整视图的状态。

于 2013-03-23T09:52:50.420 回答