-1

我有一个带有缩略图的 ListView。ListView 中的所有可见行都没有问题。但是对于可见行下方的那些新行,即使我尝试不为这些缩略图分配任何图像ImageViews,从第一行开始的图像也会以与可见行相同的顺序复制。我在那些代码行中设置断点,在 thumbnail 处分配图像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);
                }
            }
        }   


    }
4

2 回答 2

1

检查您的布局。也许您默认为您的图像设置 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' ViewHolder Pattern

于 2013-08-21T13:41:03.503 回答
0

这是因为 ListView 重用了对可见视图变得不可见的视图。如果要隐藏图像,则需要在适配器的getView()方法中显式执行此操作。

于 2013-08-21T13:39:11.080 回答