日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 解决listview.notifyDataSetChanged刷新时Imageloader加载图片闪烁问题

發布時間:2024/4/15 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 解决listview.notifyDataSetChanged刷新时Imageloader加载图片闪烁问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天,簡單講講android里再listview調用notifyDataSetChanged刷新界面時,Imageloader加載圖片會閃爍的問題。

最近,發現app里的listview圖片會出現閃爍的情況。我發現是由于調用notifyDataSetChanged這個方法時候,圖片全部閃爍一下,原因是圖片全部重新加載了一次,導致閃爍。后來修改為局部刷新,但是還是還是存在是不是閃爍的情況,于是在網上查找資料,最終解決了問題。這里記錄一下。


一.網上無用的解決代碼

網上關于圖片閃爍的解決代碼很多,但是大多不是我想要的。比如有人說:

??? 真正的閃爍原因不是display和imageload方法的緣故,而是在設置option時,設置了.displayer(new FadeInBitmapDisplayer(200))的緣故,直接設置為.displayer(new SimpleBitmapDisplayer()),然后再getview方法中調用display方法,就不會閃爍了.這個我試過了,沒有一點效果。

還有人說:

在一個頻繁刷新的ListView中使用ImageLoader后,在某些手機上會發現圖片閃動。經過分析,原來是DisplayImageOptions的問題。

之前的DisplayImageOptions是這樣寫的:

imageOptions = new DisplayImageOptions.Builder().bitmapConfig(Bitmap.Config.RGB_565).showStubImage(R.drawable.icon_default) .showImageForEmptyUri(R.drawable.icon_default).showImageOnFail(R.drawable.icon_default).cacheInMemory(true) .cacheOnDisc(true).build();

其中的showStubImage()造成了加載前先顯示默認圖片的問題,造成了閃動。修改為以下代碼后就正常了:

imageOptions = new DisplayImageOptions.Builder().bitmapConfig(Bitmap.Config.RGB_565) .showImageForEmptyUri(R.drawable.icon_default).showImageOnFail(R.drawable.icon_default).cacheInMemory(true) .cacheOnDisc(true).build(); 這個只是解決加載圖片前顯示默認加載圖片的問題,和我的因為頻繁刷新導致的問題不一樣。

二.解決問題的代碼

下面是我之前的getView方法中。下面的ImageLoader直接調用,造成每次notifyDataSetChanged,重新調用了ImageLoader方法。

@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.item_app_wall2, parent, false);holder = new ViewHolder();holder.icon = (ImageView) convertView.findViewById(R.id.app_icon);holder.name = (MarqueeText) convertView.findViewById(R.id.app_name);// holder.grade = (ImageView)// convertView.findViewById(R.id.grade);holder.size = (TextView) convertView.findViewById(R.id.app_size);holder.count = (TextView) convertView.findViewById(R.id.app_count);holder.ratingBar = (RatingBar) convertView.findViewById(R.id.grade);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}ImageLoader.getInstance().displayImage(searchAppList.get(position).getHttpIco(), holder.icon,DisplayImageOptionUtil.getInstance().getOptions());holder.name.setText(searchAppList.get(position).getName().trim());holder.size.setText(CommonUtil.format(searchAppList.get(position).getApkSize() / (float) 1024) + "M");AppStatistics statistics = searchAppList.get(position).getAppStatistics();if (statistics != null) {holder.count.setText(statistics.getDownloadCount() + "次");}holder.ratingBar.setRating(searchAppList.get(position).getAveccore() / 2f);return convertView;}

下面我做出了修改,如果當前圖片是之前的圖片,則不會調用ImageLoader,否則調用ImageLoader。

public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.item_app_wall2, parent, false);holder = new ViewHolder();holder.icon = (ImageView) convertView.findViewById(R.id.app_icon);holder.name = (MarqueeText) convertView.findViewById(R.id.app_name);// holder.grade = (ImageView)// convertView.findViewById(R.id.grade);holder.size = (TextView) convertView.findViewById(R.id.app_size);holder.count = (TextView) convertView.findViewById(R.id.app_count);holder.ratingBar = (RatingBar) convertView.findViewById(R.id.grade);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}if (searchAppList.get(position).getHttpIco().equals(holder.icon.getTag())) {} else {// 如果不相同,就加載。現在在這里來改變閃爍的情況ImageLoader.getInstance().displayImage(searchAppList.get(position).getHttpIco(), holder.icon,DisplayImageOptionUtil.getInstance().getOptions());holder.icon.setTag(searchAppList.get(position).getHttpIco());}holder.name.setText(searchAppList.get(position).getName().trim());holder.size.setText(CommonUtil.format(searchAppList.get(position).getApkSize() / (float)1024) + "M");AppStatistics statistics = searchAppList.get(position).getAppStatistics();if (statistics != null){holder.count.setText(statistics.getDownloadCount() + "次");}holder.ratingBar.setRating(searchAppList.get(position).getAveccore() / 2f);return convertView; }
通過ImageView.getTag和setTag方法來,判定當前圖片是否是之前的,如果是之前,則不會刷新圖片,如果不是,再刷新。

簡單講講,其實就是在每次getView時,ImageView通過setTag將家中圖片的路徑保存起來,當調用notifyDataSetChanged時,需要刷新界面,首先判斷需要重新加載的圖片路徑和ImageView.getTag是否相同,如果相同,就不需要重新加載,這樣避免了無用的重復加載相同圖片。


android 解決listview.notifyDataSetChanged刷新時Imageloader加載圖片閃爍問題就講完了。


就這么簡單。



總結

以上是生活随笔為你收集整理的android 解决listview.notifyDataSetChanged刷新时Imageloader加载图片闪烁问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。