Android Listview 加载图片优化--本地加载大量图片,解决滑动卡顿现象(滑动停止加载图片)

转自:http://blog.csdn.net/cuixbo/article/details/8260844

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

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

所以有这样的思路:

1.监听Listview的scroll状态,

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

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

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

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

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

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


贴部分代码:

[java]  view plain copy
  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.   
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值