Android 为什么在ListView中自动设置缩略图
我有一个带有缩略图的列表视图。ListView中的所有可见行都没有问题。 但是对于可见行下方的新行,即使我尝试不将任何图像分配给那些缩略图Android 为什么在ListView中自动设置缩略图,android,Android,我有一个带有缩略图的列表视图。ListView中的所有可见行都没有问题。 但是对于可见行下方的新行,即使我尝试不将任何图像分配给那些缩略图imageview,从第一行开始的图像复制的顺序与可见行中的顺序完全相同。我在分配缩略图ImageViews图像的代码行上设置了断点,没有断点被命中,但仍然得到图像。背后的理论是什么?如何停止在可见图像下方的行自动分配图像。 谢谢 编辑1: public View getView(int position, View convertView, Vi
imageview
,从第一行开始的图像复制的顺序与可见行中的顺序完全相同。我在分配缩略图ImageViews
图像的代码行上设置了断点,没有断点被命中,但仍然得到图像。背后的理论是什么?如何停止在可见图像下方的行自动分配图像。
谢谢
编辑1:
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
ViewHolder viewHolder=new ViewHolder();
LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(vi==null){
vi = inflater.inflate(R.layout.list_row, parent, false);
viewHolder.id=(TextView)vi.findViewById(R.id.title);
viewHolder.thumbnailImage=(ImageView)vi.findViewById(R.id.list_image);
viewHolder.activationStatus = (TextView)vi.findViewById(R.id.activated);
//lazy load image
BitmapWorkerTask task = new BitmapWorkerTask(viewHolder.thumbnailImage);
//if beyond visible rows, position
//becomes zero again, at that time cnt is not zero
//so task is not executed, to prevent image assignment
//for rows below the visible ones
if(position == cnt){
String id = listIDs.get(position);
task.execute(id);
cnt++;
}else{
cnt = 0;
}
//Lazy image update
class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
public BitmapWorkerTask(ImageView imageView) {
// Use a WeakReference to ensure the ImageView can be garbage collected
imageViewReference = new WeakReference<ImageView>(imageView);
}
// Decode image in background.
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmap = null;
dbHelper.open();
byte[] img_bytes = dbHelper.getImagebyIDnumber(params[0]);
bitmap = BitmapFactory.decodeByteArray(img_bytes, 0, img_bytes.length);
dbHelper.close();
return bitmap;
}
// Once complete, see if ImageView is still around and set bitmap.
@Override
protected void onPostExecute(Bitmap bitmap) {
if (imageViewReference != null && bitmap != null) {
final ImageView imageView = imageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
}
public View getView(int位置、视图转换视图、视图组父级){
视图vi=转换视图;
ViewHolder ViewHolder=新ViewHolder();
LayoutFlater充气器=(LayoutFlater)this.getContext().getSystemService(Context.LAYOUT\u充气器\u服务);
如果(vi==null){
vi=充气机。充气(R.layout.list_行,父项,false);
viewHolder.id=(TextView)vi.findViewById(R.id.title);
viewHolder.thumbnailImage=(ImageView)vi.findViewById(R.id.list\u图像);
viewHolder.activationStatus=(TextView)vi.findViewById(R.id.activated);
//延迟加载映像
BitmapWorkerTask任务=新建BitmapWorkerTask(viewHolder.thumbnailImage);
//如果超出可见行,请定位
//再次变为零,此时cnt不是零
//所以不执行任务,以防止图像分配
//对于可见行下方的行
如果(位置==cnt){
String id=listIDs.get(位置);
任务执行(id);
cnt++;
}否则{
cnt=0;
}
//延迟图像更新
类BitmapWorkerTask扩展了AsyncTask{
私有最终WeakReference imageViewReference;
公共位图工作任务(ImageView ImageView){
//使用WeakReference确保可以对ImageView进行垃圾收集
imageViewReference=新的WeakReference(imageView);
}
//在背景中解码图像。
@凌驾
受保护位图doInBackground(字符串…参数){
位图=空;
dbHelper.open();
byte[]img_bytes=dbHelper.getImagebyIDnumber(参数[0]);
位图=位图工厂.decodeByteArray(img_字节,0,img_字节.长度);
dbHelper.close();
返回位图;
}
//完成后,查看ImageView是否仍然存在并设置位图。
@凌驾
受保护的void onPostExecute(位图){
if(imageViewReference!=null&&bitmap!=null){
最终ImageView=imageViewReference.get();
如果(imageView!=null){
设置图像位图(位图);
}
}
}
}
这是因为ListView将不可见的视图重新用于可见视图。如果要隐藏图像,则需要在适配器的方法中明确执行此操作。检查布局。可能您默认为图像设置了android:src=“@drawable…”
在适配器中配置listView数据
编辑于22.08。
尝试使用以下方法:
if(vi==null){
...
//findView by ID here;
...
vi.setTag(viewHolder);
} else {
viewHolder = ( ViewHolder ) vi.getTag();
}
//to do what you want here;
//setting values etc.
您可以在此处找到关于“如何使用ViewHolder”的详细说明列表视图循环视图。如果没有图像,则必须指定没有图像。我该怎么做?现在,即使我指定了,仍然从可见行复制这些图像。请先格式化代码。现在,您似乎在方法中声明命名类,而未编译。(因此我猜缺少了一些内容)是的,在设置任何图像之前,我有一个默认图像要分配。但是现在,可见行中的图像被完全按照相同的顺序复制。在getView()中,我防止不为新行设置任何图像,除非我是故意设置的。但是,静态图像在这些新行上的设置顺序与在可见行中的设置顺序完全相同。我试图分配图像,但无法分配并仍然复制可见行中的图像。如果(vi==null),则需要
else
case forif(vi==null)
在取消当前BitmapWorkerTask的位置,清除图像视图并启动新的BitmapWorkerTask。如果不这样做,则会看到旧视图和旧图像。您好,我喜欢这个想法。如何在else循环中取消并启动新的BitmapWorkerTask。将任务添加到holder实例,然后从那里获取它以调用cancel()
。若要为视图分配holder,请使用setTag()
方法。若要获取holder,请使用getTag()
方法。查找类似的线程以获取有关如何使用holder模式的更多信息。