转载请注明出处: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);
}
}