关于这个功能一直是我想实现的功能,但是到现在还没有实现它,因为我的数据是从网络上获取的一段JSON格式的字符串,异步用的是AsyncTask,其实用哪一种方式取值都可以,关键在于如何将这段json字符串和适配器结合起来实现分页加载。
下面我只实现了本地数据的滑动加载,至于网络数据的滑动加载还没。。
Activity的实现
public class MainActivity extends Activity { private ListView showlistview; private List<String> list=new ArrayList<String>(); private ArrayAdapter<String> adapter; private View footview;//底部视图 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); showlistview=(ListView)findViewById(R.id.showlistview); showlistview.setOnScrollListener(new myscollviewpage()); footview=getLayoutInflater().inflate(R.layout.load, null); list.addAll(Dataservice.getlist(0, 20));//添加数据 adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,android.R.id.text1, list); //添加底部视图必须在setAdapter之前 showlistview.addFooterView(footview); showlistview.setAdapter(adapter); showlistview.removeFooterView(footview);//移除 } int number=20;//每次获取的数据 int maxpage=5;//总共有多少页 boolean loadfinish=true;//判断是否要加载数据 class myscollviewpage implements OnScrollListener{ // firstVisibleItem表示第一个的索引id @Override public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) { int lastitemid=showlistview.getLastVisiblePosition();//获取当前页的最后一个索引id final int loadtotal=totalItemCount; if((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; showlistview.addFooterView(footview);//添加頁脚 new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(3000);//休眠3秒中 } catch (Exception e) { e.printStackTrace(); } List<String> result=Dataservice.getlist(loadtotal, number);//再次获取数据 handler.sendMessage(handler.obtainMessage(100,result));//提示更新数据 } }).start(); } } } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { System.out.println("当前状态"+scrollState); } } Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); list.addAll((List<String>)msg.obj);//将获取到的数据添加到list中去 adapter.notifyDataSetChanged();//刷新list if(showlistview.getFooterViewsCount()>0){//判断是否存在底部视图,存在则移除 showlistview.removeFooterView(footview); } loadfinish=true; } }; }
模拟数据的类
public class Dataservice { public static List<String> getlist(int start,int stop){ List<String> list=new ArrayList<String>(); for (int i = 0; i < 20; i++) { list.add("就快要成功了哦"+i); } return list; } }
页脚(load.xml)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/loading_layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <ProgressBar android:id="@+id/pp" android:layout_width="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:layout_height="wrap_content" android:gravity="center"
android:layout_gravity="center_vertical|center_horizontal" /> </LinearLayout>