关于ListView异步加载图片有很多方式,此篇文章讲讲本地加载大量图片时出现的卡顿现象怎么优化;
应当坚持这么一条原则:把用户的体验放在第一位,用户能看到的,触摸到的始终放在第一时间解决
所以有这样的思路:
1.监听Listview的scroll状态,
1)如果内存中有用户要看到的图片,则加载
2)内存中没有用户要看到的图片,则根据scroll状态来加载
a.scroll 为停止 则开始加载图片到内存,更新界面
b.scroll 滑动或者快速滑动 则不加载图片到内存,取而代之的是添加默认图片
3)如果根本就没有用户想看的图片,则不用加载图片到内存,直接加载默认图片
2.与之同时,主线程已开启的时候就开启一个子线程 加载用户要看到的所有图片到内存中去(完成之后更新界面,未完成时每次scroll停止的时候也会更新界面所以不会影响用户的交互)
贴部分代码:
- public class ContactsListViewAdapter extends BaseAdapter {
- private LayoutInflater inflater;
- private ArrayList<ContactDataBean> contactList;
- private int mLayoutRes;
- private Context mContext;
- private ListView lv;
- private int scrollStauts=0;
-
- public ContactsListViewAdapter(Context context, int layoutRes, ArrayList<ContactDataBean> contactList, ListView lv) {
- this.contactList = contactList;
- this.inflater = LayoutInflater.from(context);
- this.mContext = context;
- this.mLayoutRes = layoutRes;
- this.lv = lv;
- this.lv.setOnScrollListener(new AbsListView.OnScrollListener() {
-
- @Override
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- // TODO Auto-generated method stub
- switch (scrollState) {
- case AbsListView.OnScrollListener.SCROLL_STATE_IDLE://停止 0
- scrollStauts=0;
- updateUI();
- //System.out.println("停止");
- break;
- case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL://触摸滑动 1
- scrollStauts=1;
-
- //System.out.println("触摸滑动");
- break;
- case AbsListView.OnScrollListener.SCROLL_STATE_FLING://快速滑动 2
- scrollStauts=2;
- //System.out.println("快速滑动");
- break;
- default:
- break;
- }
- }
-
- @Override
- public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
- }
- });
- }
-
- public void updateUI() {
- this.notifyDataSetChanged();
- }
- public void setListData(ArrayList<ContactDataBean> contactList) {
- this.contactList = contactList;
- }
-
- public void updateDate() {
- this.notifyDataSetChanged();
- }
-
- @Override
- public int getCount() {
- return contactList.size();
- }
-
- @Override
- public Object getItem(int position) {
- return contactList.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return contactList.get(position).hashCode();
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup arg2) {
- ViewHolder holder = null;
- if (convertView == null) {
- holder = new ViewHolder();
- convertView = inflater.inflate(mLayoutRes, null);
- holder.name = (TextView) convertView.findViewById(R.id.contact_name);
- holder.image = (ImageView) convertView.findViewById(R.id.contact_image);
- convertView.setTag(holder);
- } else {
- holder = (ViewHolder) convertView.getTag();
- }
- ContactDataBean cdb = contactList.get(position);
- holder.name.setText(cdb.displayName);
- if (cdb.photo != null) {// 内存中有头像
- holder.image.setImageBitmap(cdb.photo);
- } else if (cdb.photo_id > 0) {// 实际有头像,但头像还没有加载到内存
- if(scrollStauts==0){
- Uri contactImageUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, cdb.contact_id);
- InputStream in = ContactsContract.Contacts.openContactPhotoInputStream(mContext.getContentResolver(), contactImageUri);
- cdb.photo = BitmapFactory.decodeStream(in);
- holder.image.setImageBitmap(cdb.photo);
- try {
- in.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }else {
- holder.image.setImageResource(R.drawable.call_log_contact_default);
- }
- } else {// 没有头像,设置默认头像
- holder.image.setImageResource(R.drawable.call_log_contact_default);
- }
- return convertView;
- }
-
- private class ViewHolder {
- ImageView image;
- TextView name;
- }
-
- }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。