Android ListView异步加载图片乱序 使用NetworkImageView

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553

尊重原著

解决方案 使用Volley框架的 NetworkImageView控件

把ImageView替换成了NetworkImageView。

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent" >  

    <com.android.volley.toolbox.NetworkImageView  
        android:id="@+id/image"  
        android:layout_width="match_parent"  
        android:layout_height="120dp"  
        android:src="@drawable/empty_photo"   
        android:scaleType="fitXY"/>  

</LinearLayout> 

然后修改ImageAdapter中的代码,如下所示:

package com.gaoo.listviewtest;
/**
 * 解决listView加载图片错位
 * 解决方案  使用NetworkImageView 是Volley当中提供的控件
 * 步骤 1: 修改子条目的布局界面 为<com.android.volley.toolbox.NetworkImageView  .... />
 */
public class ImageAdapter3 extends ArrayAdapter<String> {
    //创建一个 ImageLoader 对象
    ImageLoader mImageLoader;

    public ImageAdapter3(Context context, int resource, String[] objects) {
        super(context, resource, objects);

        RequestQueue queue = Volley.newRequestQueue(context);
        mImageLoader = new ImageLoader(queue, new BitmapCache());
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String url = getItem(position);
        View view;
        if (convertView==null){
            view = LayoutInflater.from(getContext()).inflate(R.layout.item_image3,null);
        }else{
            view=convertView;
        }

        NetworkImageView networkImageView = (NetworkImageView) view.findViewById(R.id.image);
        networkImageView.setDefaultImageResId(R.drawable.empty_photo);
        networkImageView.setErrorImageResId(R.drawable.empty_photo);

        networkImageView.setImageUrl(url, mImageLoader);

        return view;
    }

    /**
     * 使用LruCache来缓存图片
     */
    private class BitmapCache implements ImageLoader.ImageCache {
        private LruCache<String, Bitmap> mLruCache;

        public BitmapCache() {
            //获取应用程序最大可用内存
            int maxMemory = (int) Runtime.getRuntime().maxMemory();
            int cacheSize = maxMemory / 8;

            mLruCache = new LruCache<String, Bitmap>(cacheSize) {
                @Override
                protected int sizeOf(String key, Bitmap bitmap) {
                    return bitmap.getRowBytes() * bitmap.getHeight(); //返回值 //每一行的字节个数*高度 = bitmap的大小
                }
            };
        }
        @Override
        public Bitmap getBitmap(String url) {
            Log.d("BitmapCache", "从内存中获取");
            return mLruCache.get(url);
        }
        @Override
        public void putBitmap(String url, Bitmap bitmap) {
            mLruCache.put(url, bitmap);
        }
    }
}
/**
 * Android ListView异步加载图片乱序问题,原因分析及解决方案
 * 原文地址 : http://blog.csdn.net/guolin_blog/article/details/45586553
 */
public class MainActivity extends AppCompatActivity {
    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.list_view);

        //方法 解决方案 使用 volley
//        ImageAdapter3 adapter3 = new ImageAdapter3(this,0, ImageId.imageUrl);
//        listView.setAdapter(adapter3);

    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值