public class MainActivity extends Activity { private ListView listView=null; //listview的數據填充器 private ArrayAdapter<String> adapter; //listview中數據的集合 private List<String> data; //下一頁初始化為0 int nextpage = 0; //每一頁記載多少數據 private int number=10; //最多有幾頁 private int maxpage=5; //用來判斷是否加載完成 private boolean loadfinish=true; private View v; private Handler handler; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //listview中腳跟的視圖 v=this.getLayoutInflater().inflate(R.layout.progress, null); listView=(ListView) super.findViewById(R.id.listview); //得到數據 data=DataServer.getData(0,10); //實習化ArrayAdapter對象 adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, data); //添加listview的腳跟視圖,這個方法必須在listview.setAdapter()方法之前,否則無法顯示視圖 listView.addFooterView(v); //添加數據 listView.setAdapter(adapter); //當下一頁的數據加載完成之后移除改視圖 listView.removeFooterView(v); //當用戶滑動listview到最后一項是,動態的加載第二頁的數據 listView.setOnScrollListener(new OnScrollListener() { public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub } @Override public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, final int totalItemCount) { //得到listview最后一項的id int lastItemId=listView.getLastVisiblePosition(); //判斷用戶是否滑動到最后一項,因為索引值從零開始所以要加上1 if((lastItemId+1)==totalItemCount) { /** * 計算當前頁,因為每一頁只加載十條數據,所以總共加載的數據除以每一頁的數據的個數 * 如果余數為零則當前頁為currentPage=totalItemCount/number; * 如果不能整除則當前頁為(int)(totalItemCount/number)+1; * 下一頁則是當前頁加1 */ int currentPage=totalItemCount%number; if(currentPage==0) { currentPage=totalItemCount/number; } else { currentPage=(int)(totalItemCount/number)+1; } System.out.println("當前頁為:"+currentPage); nextpage=currentPage+1; //當總共的數據大於0是才加載數據 if(totalItemCount>0) { //判斷當前頁是否超過最大頁,以及上一頁的數據是否加載完成 if(nextpage<=maxpage && loadfinish ) { //添加頁腳視圖 listView.addFooterView(v); loadfinish=false; new Thread(new Runnable() { public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //獲取當前加載頁的數據 data=DataServer.getData(totalItemCount, 10); //通知listview改變UI中的數據 handler.sendEmptyMessage(0); } }).start(); //還可以通過這樣的方式實現 //AsyncTaskLoadData asynctask=new AsyncTaskLoadData(totalItemCount); ///asynctask.execute(); } } } //判斷加載的數據的頁數有沒有超過最大頁,並且是否已經記載完成 } }); handler=new Handler() { @SuppressLint("HandlerLeak") public void handleMessage(Message msg) { if(msg.what==0) { //通知listview中的數據已經改動 adapter.notifyDataSetChanged(); loadfinish=true; } super.handleMessage(msg); //判斷listview中的頁腳視圖是否存在,如果存在在刪除頁腳視圖 if(listView.getFooterViewsCount()!=0) { listView.removeFooterView(v); } } }; } //異步加載數據 @SuppressWarnings("unused") private final class AsyncTaskLoadData extends AsyncTask<Object, Object, Object> { private int count; private List<String> list; public AsyncTaskLoadData(int totalItemCount) { this.count=totalItemCount; list=new ArrayList<String>(); } protected Object doInBackground(Object... params) { list=DataServer.getData(count, 10); return null; } @Override protected void onPostExecute(Object result) { try { data=list; adapter.notifyDataSetChanged(); Thread.sleep(2000); loadfinish=true; if(listView.getFooterViewsCount()!=0) { listView.removeFooterView(v); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } super.onPostExecute(result); } } }
數據提供類
1 public class DataServer 2 { 3 private static List<String> data=new ArrayList<String>(); 4 public static List<String> getData(int offset, int maxnumber) 5 { 6 for(int i=0;i<maxnumber;i++) 7 { 8 data.add("Listview分頁加載數據"+"item"+i); 9 } 10 return data; 11 } 12 }
運行效果: