打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Android Listview 加载图片优化

关于ListView异步加载图片有很多方式,此篇文章讲讲本地加载大量图片时出现的卡顿现象怎么优化;

应当坚持这么一条原则:把用户的体验放在第一位,用户能看到的,触摸到的始终放在第一时间解决

所以有这样的思路:

1.监听Listview的scroll状态,

1)如果内存中有用户要看到的图片,则加载

2)内存中没有用户要看到的图片,则根据scroll状态来加载

a.scroll 为停止    则开始加载图片到内存,更新界面

b.scroll 滑动或者快速滑动  则不加载图片到内存,取而代之的是添加默认图片

3)如果根本就没有用户想看的图片,则不用加载图片到内存,直接加载默认图片

2.与之同时,主线程已开启的时候就开启一个子线程  加载用户要看到的所有图片到内存中去(完成之后更新界面,未完成时每次scroll停止的时候也会更新界面所以不会影响用户的交互)


贴部分代码:

  1. public class ContactsListViewAdapter extends BaseAdapter {  
  2.     private LayoutInflater inflater;  
  3.     private ArrayList<ContactDataBean> contactList;  
  4.     private int mLayoutRes;  
  5.     private Context mContext;  
  6.     private ListView lv;  
  7.     private int scrollStauts=0;  
  8.   
  9.     public ContactsListViewAdapter(Context context, int layoutRes, ArrayList<ContactDataBean> contactList, ListView lv) {  
  10.         this.contactList = contactList;  
  11.         this.inflater = LayoutInflater.from(context);  
  12.         this.mContext = context;  
  13.         this.mLayoutRes = layoutRes;  
  14.         this.lv = lv;  
  15.         this.lv.setOnScrollListener(new AbsListView.OnScrollListener() {  
  16.   
  17.             @Override  
  18.             public void onScrollStateChanged(AbsListView view, int scrollState) {  
  19.                 // TODO Auto-generated method stub  
  20.                 switch (scrollState) {  
  21.                 case AbsListView.OnScrollListener.SCROLL_STATE_IDLE://停止  0  
  22.                     scrollStauts=0;  
  23.                     updateUI();  
  24.                     //System.out.println("停止");  
  25.                     break;  
  26.                 case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL://触摸滑动  1  
  27.                     scrollStauts=1;  
  28.                       
  29.                     //System.out.println("触摸滑动");  
  30.                     break;  
  31.                 case AbsListView.OnScrollListener.SCROLL_STATE_FLING://快速滑动    2  
  32.                     scrollStauts=2;  
  33.                     //System.out.println("快速滑动");  
  34.                     break;  
  35.                 default:  
  36.                     break;  
  37.                 }  
  38.             }  
  39.   
  40.             @Override  
  41.             public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {  
  42.             }  
  43.         });  
  44.     }  
  45.   
  46.     public void updateUI() {  
  47.         this.notifyDataSetChanged();  
  48.     }  
  49.     public void setListData(ArrayList<ContactDataBean> contactList) {  
  50.         this.contactList = contactList;  
  51.     }  
  52.   
  53.     public void updateDate() {  
  54.         this.notifyDataSetChanged();  
  55.     }  
  56.   
  57.     @Override  
  58.     public int getCount() {  
  59.         return contactList.size();  
  60.     }  
  61.   
  62.     @Override  
  63.     public Object getItem(int position) {  
  64.         return contactList.get(position);  
  65.     }  
  66.   
  67.     @Override  
  68.     public long getItemId(int position) {  
  69.         return contactList.get(position).hashCode();  
  70.     }  
  71.   
  72.     @Override  
  73.     public View getView(int position, View convertView, ViewGroup arg2) {  
  74.         ViewHolder holder = null;  
  75.         if (convertView == null) {  
  76.             holder = new ViewHolder();  
  77.             convertView = inflater.inflate(mLayoutRes, null);  
  78.             holder.name = (TextView) convertView.findViewById(R.id.contact_name);  
  79.             holder.image = (ImageView) convertView.findViewById(R.id.contact_image);  
  80.             convertView.setTag(holder);  
  81.         } else {  
  82.             holder = (ViewHolder) convertView.getTag();  
  83.         }  
  84.         ContactDataBean cdb = contactList.get(position);  
  85.         holder.name.setText(cdb.displayName);  
  86.         if (cdb.photo != null) {// 内存中有头像  
  87.             holder.image.setImageBitmap(cdb.photo);  
  88.         } else if (cdb.photo_id > 0) {// 实际有头像,但头像还没有加载到内存  
  89.             if(scrollStauts==0){  
  90.                 Uri contactImageUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, cdb.contact_id);  
  91.                 InputStream in = ContactsContract.Contacts.openContactPhotoInputStream(mContext.getContentResolver(), contactImageUri);  
  92.                 cdb.photo = BitmapFactory.decodeStream(in);  
  93.                 holder.image.setImageBitmap(cdb.photo);  
  94.                 try {  
  95.                     in.close();  
  96.                 } catch (IOException e) {  
  97.                     e.printStackTrace();  
  98.                 }  
  99.             }else {  
  100.                 holder.image.setImageResource(R.drawable.call_log_contact_default);  
  101.             }  
  102.         } else {// 没有头像,设置默认头像  
  103.             holder.image.setImageResource(R.drawable.call_log_contact_default);  
  104.         }  
  105.         return convertView;  
  106.     }  
  107.   
  108.     private class ViewHolder {  
  109.         ImageView image;  
  110.         TextView name;  
  111.     }  
  112.   
  113. }  


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
ListView OnScrollListener详解(滑屏分页显示数据)
ListView交互优化
android-BaseAdapter中的notifyDataSetChanged()
记录和恢复ListView滚动的位置
Android中ListView动态加载数据
[Android] Android开发优化之——从代码角度进行优化
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服