標籤:android style blog class code java
Android資料分批載入-滑動到底部自動載入列表
2014年5月9日
本博文介紹如何進行資料分批載入,在應用開發當中會經常使用到ListView,點擊更多載入資料是我們經常簡單,為了提供使用者體驗,當使用者將列表滾動到底部自動載入資料,這樣的形式用得比較多。
下面給大家提供的例子是,每次類比20條資料,滑動到底部時再請求20條資料直到請求到限定頁數為止
具體代碼實現:
/08_Datapageload/src/com/wwj/datapageload/MainActivity.java
package com.wwj.datapageload;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.util.Log;import android.view.View;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.ArrayAdapter;import android.widget.ListView;public class MainActivity extends Activity {private ListView listView;private List<String> data = new ArrayList<String>();ArrayAdapter<String> adapter;View footer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);footer = getLayoutInflater().inflate(R.layout.footer, null);listView = (ListView) findViewById(R.id.listView);listView.setOnScrollListener(new ScrollListener());// 類比資料data.addAll(DataService.getData(0, 20));adapter = new ArrayAdapter<String>(this, R.layout.listview_item,R.id.textView, data);listView.addFooterView(footer);// 添加頁尾(放在ListView最後)listView.setAdapter(adapter);listView.removeFooterView(footer);}private int number = 20; // 每次擷取多少條資料private int maxpage = 5; // 總共有多少頁private boolean loadfinish = true; // 指示資料是否載入完成private final class ScrollListener implements OnScrollListener {@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {Log.i("MainActivity", "onScroll(firstVisibleItem="+ firstVisibleItem + ",visibleItemCount="+ visibleItemCount + ",totalItemCount=" + totalItemCount+ ")");final int loadtotal = totalItemCount;int lastItemid = listView.getLastVisiblePosition(); // 擷取當前螢幕最後Item的IDif ((lastItemid + 1) == totalItemCount) { // 達到資料的最後一條記錄if (totalItemCount > 0) {// 當前頁int currentpage = totalItemCount % number == 0 ? totalItemCount/ number: totalItemCount / number + 1;int nextpage = currentpage + 1; // 下一頁if (nextpage <= maxpage && loadfinish) {loadfinish = false;listView.addFooterView(footer);// 開一個線程載入資料new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}List<String> result = DataService.getData(loadtotal, number);// 發送訊息handler.sendMessage(handler.obtainMessage(100,data));}}).start();}}}}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {Log.i("MainActivity", "onScrollStateChanged(scrollState="+ scrollState + ")");}}private Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {data.addAll((List<String>) msg.obj);// 告訴ListView資料已經發生改變,要求ListView更新介面顯示adapter.notifyDataSetChanged();if (listView.getFooterViewsCount() > 0) { // 如果有底部視圖listView.removeFooterView(footer);}loadfinish = true; // 載入完成};};}
/08_Datapageload/src/com/wwj/datapageload/DataService.java
package com.wwj.datapageload;import java.util.ArrayList;import java.util.List;public class DataService {public static List<String> getData(int offset, int maxResult) { // 分頁limit// 0,20List<String> data = new ArrayList<String>();for (int i = 0; i < 20; i++) {data.add("ListView資料的分批載入" + i);}return data;}}
如下: