ListView加载网络图片--------闪图问题解决

本文探讨了ListView中出现网络图片闪图问题的原因,并提供了两种解决方案:使用SmartImageView库通过setImageUrl方法设置图片,以及利用Picasso库加载图片到缓存后再显示。这两种方法都能有效解决闪图问题,确保图片平稳加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ListView解决网络图片闪图问题

    闪图问题根本原因是网络图片还没缓存下来就呈现,出现异步错误。

解决的方法也就是让网络图片先缓存下来,然后再呈现出来


一种方法是导入一个SmartImageView类库,然后调用setImageUrl(url)方法

holder.mIvHead.setImageUrl(user.headImg);

url参数是一个字符串路径

具体代码

public View getView(int position, View view, ViewGroup parent) {

		ViewHolder holder = null;

		if (view == null) {
			view = View.inflate(context, R.layout.msg_list_item, null);
			holder = new ViewHolder();
			holder.mIvHead = (SmartImageView) view.findViewById(R.id.ivHead);
			holder.mTvName = (TextView) view.findViewById(R.id.tvName);
			view.setTag(holder);
		} else {
			holder = (ViewHolder) view.getTag();
		}

		User user = userList.get(position);
		holder.mTvName.setText(user.name);
		holder.mIvHead.setImageUrl(user.headImg);

		return view;
	}



另一种方法是添加一个Picasso   jar包

加上一句代码

Picasso.with(context).load(user.headImg).into(holder.mIvHead);

    

具体代码

public View getView(int position, View view, ViewGroup parent) {

		ViewHolder holder = null;

		if (view == null) {
			view = View.inflate(context, R.layout.msg_list_item, null);
			holder = new ViewHolder();
			holder.mIvHead = (ImageView) view.findViewById(R.id.ivHead);
			holder.mTvName = (TextView) view.findViewById(R.id.tvName);
			view.setTag(holder);
		} else {
			holder = (ViewHolder) view.getTag();
		}
		// TextView mTvName = (TextView) view.findViewById(R.id.tvName);
		// mIvHead = (ImageView) view.findViewById(R.id.ivHead);

		User user = userList.get(position);
		holder.mTvName.setText(user.name);
		Picasso.with(context).load(user.headImg).into(holder.mIvHead);

		return view;
	}


以上两种问题都可以解决闪图问题,或者自己写,先把图片缓存下来,然后再做呈现工作。


    

第一次获得的网络请求的图片写到内存中去

public static Bitmap getImageHttpClientGet(String path) throws Exception
	{
		// 缓存
		// ? 本地有没有? /aaaa.jpg
		String localPath = CommonApplication.context.getCacheDir().getPath()
				+ "/" + UUID.nameUUIDFromBytes(path.getBytes()).toString();
		File file = new File(localPath);
		if (file.exists())
		{
			FileInputStream fileInputStream = new FileInputStream(file);
			return BitmapFactory.decodeStream(fileInputStream);
		} else
		{
			// 抽象类
			HttpClient client = new DefaultHttpClient();
			// 参数编码
			// path = URLEncoder.encode(path);
			// 创建请求 http
			HttpGet httpGet = new HttpGet(path);

			HttpResponse response = client.execute(httpGet);

			int statusCode = response.getStatusLine().getStatusCode();

			if (statusCode == 200)
			{
				HttpEntity entity = response.getEntity();
				InputStream in = entity.getContent();
				byte[] bytes = StreamUtil.getBytesByInputStream(in, localPath);

				Bitmap decodeByteArray = BitmapFactory.decodeByteArray(bytes,
						0, bytes.length);
				return decodeByteArray;
			}

		}

		return null;
	}



这个可以实现ImageView异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画。解决了:1. listview加载oom问题 2. listview加载时卡顿的现象 3. listview加载时item中图片重复错位等情况 可以配置: 1. 设置加载图片的最大尺寸 2. 设置默认图片的显示 3. 设置图片位图模式 4. 设置内存缓存的最大值。 5. 文件缓存保存的目录   这个框架基本的代码是很久以前知道哪弄的,零零碎碎的,现在已经优化了很多,所以现在上传到github上共享。   讲讲使用方式吧:   首先使用前下载源码或者jar包(见github:https://github.com/wangjiegulu/ImageLoaderSample) 然后进行图片加载器(ImageLoader)的配置和初始化,推荐的方法如下: 新建MyApplication类,继承Application,在onCreate中增加如下代码:/**  * Created with IntelliJ IDEA.  * Author: wangjie  email:tiantian.china.2@gmail.com  * Date: 14-2-27  * Time: 上午11:25  */ public class MyApplication extends Application{     @Override     public void onCreate() {         super.onCreate();         ImageLoader.init(getApplicationContext(),                 new CacheConfig()                     .setDefRequiredSize(600) // 设置默认的加载图片尺寸(表示任一超过该值,默认是70px)                     .setDefaultResId(R.drawable.ic_launcher) // 设置显示的默认图片(默认是0,即空白图片)                     .setBitmapConfig(Bitmap.Config.ARGB_8888) // 设置图片位图模式(默认是Bitmap.CacheConfig.ARGB_8888)                     .setMemoryCachelimit(Runtime.getRuntime().maxMemory() / 3) // 设置图片内存缓存大小(默认是Runtime.getRuntime().maxMemory() / 4) //                  .setFileCachePath(Environment.getExternalStorageDirectory().toString()   "/mycache") // 设置文件缓存保存目录         );     }     …… }然后再AndroidManifest.xml中添加:......到此,配置已经全部完成:接下来,使用ImageLoader来加载图片:holder.progress.setText("0%");     holder.progress.setVisibility(View.VISIBLE);     final ViewHolder vhr = holder;     ImageLoader.getInstances().displayImage(list.get(position), holder.image, new ImageLoader.OnImageLoaderListener() {         @Override         public void onProgressImageLoader(ImageView imageView, int currentSize, int totalSize) {             vhr.progress.setText(currentSize * 100 / totalSize   "%");         }         @Override         public void onFinishedImageLoader(ImageView imageView, Bitmap bitmap) {             vhr.progress.setVisibility(View.GONE);         }     });     或者:     ImageLoader.getInstances().displayImage(url, imageIv);     或者     ImageLoader.getInstances().displayImage(url, imageIv, 100);备注:例子中,用到了一部分注解(与ImageLoader功能无关,但是可以简化代码的编写) 可以点下面连接进入:github:https://github.com/wangjiegulu/androidInject博客:http://www.cnblogs.com/tiantianbyconan/p/3459139.htmlhttp://www.cnblogs.com/tiantianbyconan/p/3540427.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值