一、什么是分頁加載
在下面的文章中,我們來講解LitView分頁加載的實現。什么是分頁加載呢?我們先看幾張效果圖吧,如下:


效果說明:我們向上滑動ListView的時候,當滑動的最底部, 便會出現正在加載的進度條,當加載完成后,會出現加載后的數據。如此反復,這其實就是ListView的分頁加載功能。像這樣的工能,實在是太常見了。那么它是怎么實現的呢?
實現原理很簡單,本質上,其實就是一個自定義的ListView,加上了底布局(即有進度條的那個布局),然后實現了ListView的OnScrollListener監聽而已(即拖動監聽)。下面我們就開始一步一步手把手使用模擬的數據來實現這個功能。
二、准備簡單的ListView
為了准備模擬的數據,我們先搭建一個簡單的普通的ListView出來,因為我們需要這樣一個Demo。搭建完成后,我們再將ListView改成我們自定義的ListView,這樣子你就能看清楚到底是怎么實現的了。
搭建ListView很簡單。首先實現主布局和子項布局。分別如下:
主布局,activity_main.xml,代碼如下:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:background="#ccffff"> 6 7 <ListView 8 android:id= "@+id/list_view" 9 android:layout_width="match_parent" 10 android:layout_height="match_parent" 11 android:dividerHeight="5dp" 12 android:divider="#00cc00"></ListView> 13 </LinearLayout>
子項布局 item.xml,需要用到一張圖片(就是那個刀刀狗),這里讀者自行替換為你自己的圖片即可。代碼如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="wrap_content" 4 android:layout_height="wrap_content" 5 android:orientation="horizontal" > 6 7 <ImageView 8 android:layout_width="wrap_content" 9 android:layout_height="wrap_content" 10 android:src="@drawable/me"/> 11 12 <TextView 13 android:id="@+id/text_view" 14 android:layout_width="wrap_content" 15 android:layout_height="wrap_content" 16 android:text="你好,分頁加載" 17 android:layout_gravity="center_vertical" 18 android:textSize="20sp"/> 19 </LinearLayout>
好了,布局我們搞定了。下面就開始寫MainActivity中的代碼吧。代碼如下:
1 package com.fuly.load; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import android.os.Bundle; 7 import android.app.Activity; 8 import android.widget.ListView; 9 10 public class MainActivity extends Activity { 11 12 private ListView lv; 13 private List<MyData> mDatas = new ArrayList<MyData>(); 14 private MyAdapter mAdapter; 15 16 17 protected void onCreate(Bundle savedInstanceState) { 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.activity_main); 20 21 initData();//該方法初始化數據 22 lv = (ListView) findViewById(R.id.list_view); 23 mAdapter = new MyAdapter(this, mDatas); 24 lv.setAdapter(mAdapter); 25 26 27 } 28 29 30 /** 31 * 該方法初始化數據,即提供初始的素材 32 */ 33 private void initData() { 34 for(int i = 0;i<12;i++){ 35 MyData md = new MyData("你好,我是提前設定的"); 36 mDatas.add(md); 37 } 38 39 } 40 }
當然了,少不了我們的實體類(即封裝數據的類),MyData.代碼如下:
1 package com.fuly.load; 2 3 public class MyData { 4 5 private String txt; 6 7 public MyData(String txt) { 8 9 this.txt = txt; 10 } 11 12 public String getTxt() { 13 return txt; 14 } 15 16 public void setTxt(String txt) { 17 this.txt = txt; 18 } 19 }
然后就是適配器,代碼如下:
1 package com.fuly.load; 2 3 import java.util.List; 4 5 import android.content.Context; 6 import android.view.LayoutInflater; 7 import android.view.View; 8 import android.view.ViewGroup; 9 import android.widget.ArrayAdapter; 10 import android.widget.TextView; 11 12 public class MyAdapter extends ArrayAdapter { 13 14 private List<MyData> Datas; 15 private LayoutInflater inflater; 16 17 public MyAdapter(Context context, List data) { 18 super(context, -1, data); 19 inflater = LayoutInflater.from(context); 20 Datas = data; 21 } 22 23 24 public View getView(int position, View convertView, ViewGroup parent) { 25 26 ViewHolder vh = null; 27 28 if(convertView == null){ 29 30 convertView = inflater.inflate(R.layout.item, parent, false); 31 vh = new ViewHolder(); 32 vh.tv = (TextView) convertView.findViewById(R.id.text_view); 33 34 convertView.setTag(vh); 35 }else{ 36 vh = (ViewHolder) convertView.getTag(); 37 } 38 39 vh.tv.setText(Datas.get(position).getTxt()); 40 41 return convertView; 42 } 43 44 class ViewHolder{ 45 46 TextView tv; 47 } 48 }
好了,ListView的Demo我們已經准備好了。下面是運行效果:

我們看此時是沒有分頁加載的。那么我們還等什么,趕緊進入下一節,實現分頁功能。
