我正在实施一个允许多张照片选择的自定义图库。
我正在使用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设置为多个(随机)图像。
有没有人经历过这样的事情?关于可能导致这种情况的任何想法?
感谢。
答案 0 :(得分:2)
您的观点是可重复使用的,这意味着每次调用getView
时都需要更新Alpha。不仅在LongPress上
为所有选定的图片创建ArrayList selectedImages
ivar
- onLongPress添加/删除图像到selectedImages
- 在getView
方法中检查图片是否存储在列表中并根据alpha
值设置
答案 1 :(得分:1)
您需要熟悉ListView
次点重用概念。基本上GridView
在滚动时重用视图。因此,如果您更改某些视图,那么它显然会被更改然后重复使用(直到您没有在getView()
中更改它的属性)。结帐Google I/O video并提供有关ListView
的更多说明,因为其中大部分也适用于GridView
。
因此,如果您需要具有不同属性的一些视图,那么您有两个选项:
notifyDataSetChanged()
动态更改类型); ViewHolder
中的某种标记,在您的情况下可能是thumbnailsselection
数组信息)和每getView()
次调用的设置视图属性; 答案 2 :(得分:1)
我建议不要在ImageView
方法中使用getView()
的点击和长按听众,而是使用ListView
或GridView
的{{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);
}
调用中,您应该验证数据对象状态,始终调整视图的状态,然后再返回。