使用异步任务在网格视图中加载图片时,未能正确加载。

4

我正在尝试异步加载网格视图中的缩略图,因为以其他方式加载需要太长时间才能显示!

当我按照正常方式操作时,它可以很好地显示图像。(代码和图片)

实用工具

public static Bitmap getThumbnail(Context context, Bitmap bitmap, int columns){
        WindowManager wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);

        int scale = size.x / columns;
        Bitmap bit = ThumbnailUtils.extractThumbnail(bitmap, scale, scale);
        return bit;
    }

适配器

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        if(convertView == null){
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.adapter_item, null);
        }
        else{
            view = convertView;
        }
        ImageView image = (ImageView)view.findViewById(R.id.img_item);
        image.setImageBitmap(Utilities.getThumbnail(context, BitmapFactory.decodeFile(((Item) this.collection.get(position)).getSrc()), 5));
        return view;
    }

加载图片的网格

使用asyncTask后的结果如下

AsyncTask

public class ImageGridHandler extends AsyncTask<String, Void, Bitmap>{
    private final WeakReference<ImageView> imageViewReference;
    private Context context;

    public ImageGridHandler(Context context, ImageView img){
        imageViewReference = new WeakReference<ImageView>(img);
        this.context = context;
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        return PixzelleUtilities.getThumbnail(this.context, BitmapFactory.decodeFile(params[0]) ,5);
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        final ImageView imageView = imageViewReference.get();
        imageView.setImageBitmap(result);
    }
}

适配器

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        if(convertView == null){
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.adapter_item, null);
        }
        else{
            view = convertView;
        }
        ImageView image = (ImageView)view.findViewById(R.id.img_item);
        image.setImageBitmap(null);
        ImageGridHandler handler = new ImageGridHandler(context, image);
        handler.execute(((Item)this.collection.get(position)).getSrc());
        return view;
    }

这些图片是小黑矩形。

图片无法正确加载

链接是正确的,因为我可以点击图片并在弹出窗口中打开!

我是否漏掉了什么?

1个回答

1
您需要通知适配器布局已更改,以便重新测量视图。但这样做很耗费资源,每次加载图片都会导致重新布局。您应该通过为每个GridView瓷砖设置固定大小来避免这种情况。目前,我猜测您的R.layout.adapter_item.xml高度为wrap_content。将其更改为固定值即可解决问题。
如果您愿意承担性能损失,请使用notifyDataSetChanged通知适配器发生了更改。

http://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()


我在动态添加项目时使用“notifyDataSetChanged”,但我不知道我必须与异步任务一起使用,让我尝试一下并将高度设置为默认值! - Rudy_TM
1
我尝试在运行时使用缩略图大小设置高度,它起作用了,谢谢你的提示! - Rudy_TM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接