分頁加載數據Demo


分頁加載數據Demo:當客戶端從服務端獲取數據量過大,一般為用戶考慮流量,我們都需要對數據進行分頁加載(譬如圖片bitmap等)

 布局代碼:listview

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent"
 3     android:layout_height="match_parent"
 4     android:orientation="vertical" >
 5 
 6     <ListView
 7         android:id="@+id/listview"
 8         android:layout_width="fill_parent"
 9         android:layout_height="fill_parent" />
10 
11 </LinearLayout>

item布局

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 6     
 7     <TextView 
 8         android:id="@+id/tv_info"
 9         android:layout_width="match_parent"
10         android:layout_height="wrap_content"
11         android:textSize="20sp"
12         android:textColor="@android:color/white"
13         android:text="分頁加載的數據    10"
14         />
15 
16 </LinearLayout>

footer頁腳

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="wrap_content"
 5     android:orientation="horizontal" >
 6     
 7     <ProgressBar 
 8         android:layout_width="wrap_content"
 9         android:layout_height="wrap_content"
10         />
11     
12     <TextView 
13         android:layout_width="match_parent"
14         android:layout_height="wrap_content"
15         android:textSize="20sp"
16         android:textColor="@android:color/white"
17         android:text="正在加載數據..........."
18         android:layout_gravity="center_vertical"
19         />
20 
21 </LinearLayout>

模擬數據

 1 package com.android.hzy.service;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 public class DataService {
 7 
 8     public List<String> getData(int startPosition, int offset) {
 9         List<String> data = new ArrayList<String>();
10         for (int i = 0; i < 20; i++) {
11             data.add("分頁加載的數據 " + i);
12         }
13         return data;
14     }
15 }

MainActivity

  1 package com.android.hzy.pageloaddata;
  2 import java.util.ArrayList;
  3 import java.util.List;
  4 import android.app.Activity;
  5 import android.os.Bundle;
  6 import android.os.Handler;
  7 import android.os.Message;
  8 import android.os.SystemClock;
  9 import android.util.Log;
 10 import android.view.View;
 11 import android.widget.AbsListView;
 12 import android.widget.AbsListView.OnScrollListener;
 13 import android.widget.ArrayAdapter;
 14 import android.widget.ListView;
 15 
 16 import com.android.hzy.service.DataService;
 17 
 18 public class MainActivity extends Activity {
 19     
 20     private static final int SUCCESS_GET_DATA = 0;
 21 
 22     private ListView listview;
 23     private DataService service;
 24     private List<String> data; // 加載的總數據
 25     private ArrayAdapter<String> adapter;
 26     
 27     private boolean finish = true; // 是否加載完成
 28     private View footer;
 29     
 30     private Handler mHandler = new Handler(){
 31 
 32         @Override
 33         public void handleMessage(Message msg) {
 34             switch (msg.what) {
 35             case SUCCESS_GET_DATA:
 36                 ArrayList<String> result = (ArrayList<String>)msg.obj;
 37                 data.addAll(result);
 38                 adapter.notifyDataSetChanged(); // 讓listview自動刷新
 39                 finish = true; // 加載完成
 40                 if(listview.getFooterViewsCount() > 0){ // 當頁腳大於0 就刪除頁腳
 41                     listview.removeFooterView(footer);
 42                 }
 43                 break;
 44 
 45             default:
 46                 break;
 47             }
 48         }
 49         
 50     };
 51 
 52     @Override
 53     protected void onCreate(Bundle savedInstanceState) {
 54         super.onCreate(savedInstanceState);
 55         setContentView(R.layout.activity_main);
 56 
 57         listview = (ListView) findViewById(R.id.listview);
 58         service = new DataService();
 59         data = new ArrayList<String>();
 60 
 61         List<String> result = service.getData(0, 20);
 62         data.addAll(result);
 63         adapter = new ArrayAdapter<String>(getApplicationContext(),R.layout.item, R.id.tv_info, data);
 64         
 65         footer = View.inflate(getApplicationContext(), R.layout.footer, null);
 66         
 67         listview.addFooterView(footer); // 這里必須添加頁腳讓setAdapter里面滿足  if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0)條件
 68         listview.setAdapter(adapter);
 69         listview.removeFooterView(footer);// 移除掉
 70         
 71         // 設置listview的滾動監聽
 72         listview.setOnScrollListener(new MyOnScrollListener());
 73         
 74         
 75         
 76     }
 77     
 78     private final class MyOnScrollListener implements OnScrollListener{
 79 
 80         
 81         private int countPage = 5; // 加載的總頁數
 82         private int pageSize = 20; // 每頁加載20條數據
 83         
 84         @Override
 85         public void onScrollStateChanged(AbsListView view, int scrollState) {
 86             // TODO Auto-generated method stub
 87             Log.i("i", "  scrollState   " + scrollState);
 88         }
 89 
 90         @Override
 91         public void onScroll(AbsListView view, int firstVisibleItem,
 92                 int visibleItemCount, int totalItemCount) {
 93             // TODO Auto-generated method stub
 94             Log.i("i", " firstVisibleItem:" + firstVisibleItem + ",visibleItemCount:" + visibleItemCount
 95                     + ",totalItemCount:" + totalItemCount);
 96             
 97             final int totalCount = firstVisibleItem + visibleItemCount; // 已經加載了多少條目
 98             int currentPage = totalCount/pageSize; // 當前頁
 99             int nextPage = currentPage + 1; // 下一頁
100             if (totalCount == totalItemCount && nextPage <= countPage && finish) {// 已經移動到了listview的最后一個條目去加載
101 
102                 finish = false; // 加載未完成
103                 // 加載數據時 添加頁腳
104                 listview.addFooterView(footer);
105                 
106                 new Thread() {
107                     public void run() {
108                         SystemClock.sleep(3000);
109                         List<String> result = service.getData(totalCount + 1, pageSize);//
110                         // 發送消息給hander
111                         Message msg = new Message();
112                         msg.what = SUCCESS_GET_DATA;
113                         msg.obj  = result;
114                         mHandler.sendMessage(msg);
115                     };
116                 }.start();
117             }
118         }
119         
120     }
121 
122 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM