1. 程式人生 > >Android Listview滑動時不載入資料,停下來時載入資料,讓App更優

Android Listview滑動時不載入資料,停下來時載入資料,讓App更優

資料來源配置(Adapter)

  1. package com.zhengsonglan.listview_loading.adapter;  
  2. import android.content.Context;  
  3. import android.view.LayoutInflater;  
  4. import android.view.View;  
  5. import android.view.ViewGroup;  
  6. import android.widget.BaseAdapter;  
  7. import android.widget.ImageView;  
  8. import android.widget.TextView;  
  9. import com.nostra13.universalimageloader.core.ImageLoader;  
  10. import com.zhengsonglan.listview_loading.R;  
  11. import com.zhengsonglan.listview_loading.entity.UserEnity;  
  12. import java.util.List;  
  13. /** 
  14.  * 
  15.  */
  16. publicclass MyAdapter extends BaseAdapter {  
  17.     Context context;  
  18.     LayoutInflater inflater;  
  19.     List<UserEnity> lists;  
  20.     privateboolean scrollState=false;  
  21.     publicvoid setScrollState(boolean scrollState) {  
  22.         this.scrollState = scrollState;  
  23.     }  
  24.     public MyAdapter(Context context, List<UserEnity> lists) {  
  25.         this.context=context;  
  26.         this.inflater=LayoutInflater.from(context);  
  27.         this
    .lists=lists;  
  28.     }  
  29.     @Override
  30.     publicint getCount() {  
  31.         return lists!=null?lists.size():0;  
  32.     }  
  33.     @Override
  34.     public Object getItem(int position) {  
  35.         return lists.get(position);  
  36.     }  
  37.     @Override
  38.     publiclong getItemId(int position) {  
  39.         return position;  
  40.     }  
  41.     @Override
  42.     public View getView(int position, View convertView, ViewGroup parent) {  
  43.         ViewHolder viewHolder;  
  44.         if (convertView == null) {  
  45.             convertView=inflater.inflate(R.layout.main_item,null,true);  
  46.             viewHolder=new ViewHolder();  
  47.             viewHolder.iv_icon= (ImageView) convertView.findViewById(R.id.main_item_iv_icon);  
  48.             viewHolder.tv_name= (TextView) convertView.findViewById(R.id.main_item_tv_name);  
  49.             convertView.setTag(viewHolder);  
  50.         } else {  
  51.             viewHolder= (ViewHolder) convertView.getTag();  
  52.         }  
  53.         UserEnity userEnity=lists.get(position);  
  54.         String img_url=userEnity.getIcon();  
  55.         if (!scrollState){  
  56.             viewHolder.tv_name.setText(userEnity.getName());  
  57.             viewHolder.tv_name.setTag(null);  
  58.             ImageLoader.getInstance().displayImage(img_url,viewHolder.iv_icon);  
  59.             viewHolder.iv_icon.setTag("1");  
  60.         }else{  
  61.             viewHolder.tv_name.setText("載入中");  
  62.             viewHolder.tv_name.setTag(userEnity.getName());  
  63.             viewHolder.iv_icon.setTag(img_url);  
  64.             viewHolder.iv_icon.setImageResource(R.mipmap.ic_launcher);  
  65.         }  
  66.         return convertView;  
  67.     }  
  68.     staticclass ViewHolder{  
  69.         TextView tv_name;  
  70.         ImageView iv_icon;  
  71.     }  
  72. }  

這個Adapter中重要的程式碼如下:
  1. //定義當前listview是否在滑動狀態
  2. privateboolean scrollState=false;  
  3. publicvoid setScrollState(boolean scrollState) {  
  4.     this.scrollState = scrollState;  
  5. }  

  1. //實體類
  2. UserEnity userEnity=lists.get(position);  
  3. if (!scrollState){//如果當前不是滑動的狀態,我們填充真資料
  4.             //填充資料
  5.             viewHolder.tv_name.setText(userEnity.getName());  
  6.             //設定Tag中資料為空表示資料已填充
  7.             viewHolder.tv_name.setTag(null);  
  8.             //載入圖片
  9.             ImageLoader.getInstance().displayImage(img_url,viewHolder.iv_icon);  
  10.             //設定tag為1表示已載入過資料
  11.             viewHolder.iv_icon.setTag("1");  
  12. }else{//如果當前是滑動的狀態,我們填充假資料
  13.             viewHolder.tv_name.setText("載入中");  
  14.             //將資料name儲存在Tag當中
  15.             viewHolder.tv_name.setTag(userEnity.getName());  
  16.             //將資料image_url儲存在Tag當中
  17.             viewHolder.iv_icon.setTag(img_url);  
  18.             //設定預設顯示圖片(最好是本地資源的圖片)
  19.             viewHolder.iv_icon.setImageResource(R.mipmap.ic_launcher);  
  20. }  

我們在看看Activity中的程式碼,主要是監聽listview的onscrolllistener方法
  1. @Override
  2.     publicvoid onScrollStateChanged(AbsListView view, int scrollState) {  
  3.         switch (scrollState){  
  4.             case AbsListView.OnScrollListener.SCROLL_STATE_IDLE://停止滾動
  5.             {  
  6.                 //設定為停止滾動
  7.                 myAdapter.setScrollState(false);  
  8.                 //當前螢幕中listview的子項的個數
  9.                 int count = view.getChildCount();  
  10.                 Log.e("MainActivity",count+"");  
  11.                 for (int i = 0; i < count; i++) {  
  12.                     //獲取到item的name
  13.                     TextView tv_name = (TextView) view.getChildAt(i).findViewById(R.id.main_item_tv_name);  
  14.                     //獲取到item的頭像
  15.                     ImageView iv_show= (ImageView) view.getChildAt(i).findViewById(R.id.main_item_iv_icon);  
  16.                     if (tv_name.getTag() != null) { //非null說明需要載入資料
  17.                         tv_name.setText(tv_name.getTag().toString());//直接從Tag中取出我們儲存的資料name並且賦值
  18.                         tv_name.setTag(null);//設定為已載入過資料
  19.                     }  
  20.                     if (!iv_show.getTag().equals("1")){//!="1"說明需要載入資料
  21.                         String image_url=iv_show.getTag().toString();//直接從Tag中取出我們儲存的資料image——url
  22.                         ImageLoader.getInstance().displayImage(image_url, iv_show);//顯示圖片
  23.                         iv_show.setTag("1");//設定為已載入過資料
  24.                     }  
  25.                 }  
  26.                 break;  
  27.             }  
  28.             case AbsListView.OnScrollListener.SCROLL_STATE_FLING://滾動做出了拋的動作
  29.             {  
  30.                 //設定為正在滾動
  31.                 myAdapter.setScrollState(true);  
  32.                 break;  
  33.             }  
  34.             case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL://正在滾動
  35.             {  
  36.                 //設定為正在滾動
  37.                 myAdapter.setScrollState(true);  
  38.                 break;  
  39.             }  
  40.         }  
  41.     }  

最後記得給listview加上滑動的監聽

listview.setOnScrollListener(this);

效果

這裡寫圖片描述