首页 > 代码库 > listView的分页滑动

listView的分页滑动

1.         ListView分页加载实现思路

实现OnScrollListener 接口重写onScrollStateChanged 和onScroll方法,使用onscroll方法实现”滑动“后处理检查是否还有新的记录,如果有,调用 addFooterView,添加记录到adapter, adapter调用 notifyDataSetChanged 更新数据;如果没有记录了,把自定义的mFooterView去掉。使用onScrollStateChanged可以检测是否滚到最后一行且停止滚动然后执行加载。

 1 [java] view plaincopyprint? 2 import android.app.ListActivity;   3 import android.os.Bundle;   4 import android.os.Handler;   5 import android.view.Gravity;   6 import android.view.View;   7 import android.view.ViewGroup;   8 import android.widget.AbsListView;   9 import android.widget.BaseAdapter;  10 import android.widget.ImageView;  11 import android.widget.LinearLayout;  12 import android.widget.ProgressBar;  13 import android.widget.TextView;  14 import android.widget.AbsListView.OnScrollListener;  15 import android.widget.LinearLayout.LayoutParams;  16 public class Test extends ListActivity implements OnScrollListener {  17     Aleph0 adapter = new Aleph0();  18     int lastItem = 0;  19     int mProgressStatus = 0;  20     private Handler mHandler = new Handler();  21     ProgressBar progressBar;  22     protected void onCreate(Bundle savedInstanceState) {  23         super.onCreate(savedInstanceState);  24    LinearLayout searchLayout = new LinearLayout(this);  25    searchLayout.setOrientation(LinearLayout.HORIZONTAL);  26          progressBar = new ProgressBar(this);  27          progressBar.setPadding(0, 0, 15, 0);  28          searchLayout.addView(progressBar,new LinearLayout.LayoutParams(  29            LinearLayout.LayoutParams.WRAP_CONTENT,  30            LinearLayout.LayoutParams.WRAP_CONTENT  31          ));  32          TextView textView = new TextView(this);  33          textView.setText("加载中...");  34          textView.setGravity(Gravity.CENTER_VERTICAL);  35          searchLayout.addView(textView,new LinearLayout.LayoutParams(  36            LinearLayout.LayoutParams.FILL_PARENT,  37            LinearLayout.LayoutParams.FILL_PARENT  38          ));  39          searchLayout.setGravity(Gravity.CENTER);  40          LinearLayout loadingLayout = new LinearLayout(this);  41          loadingLayout.addView(searchLayout,new LinearLayout.LayoutParams(  42            LinearLayout.LayoutParams.WRAP_CONTENT,  43            LinearLayout.LayoutParams.WRAP_CONTENT  44          ));  45          loadingLayout.setGravity(Gravity.CENTER);  46         getListView().addFooterView(loadingLayout);  47         // Start lengthy operation in a background thread  48 //        new Thread(new Runnable() {  49 //            public void run() {  50 //                while (mProgressStatus < 100) {  51 //  52 //                    // Update the progress bar  53 //                    mHandler.post(new Runnable() {  54 //                        public void run() {  55 //                        progressBar.setProgress(mProgressStatus);  56 //                        }  57 //                    });  58 //                }  59 //            }  60 //        }).start();  61         registerForContextMenu(getListView());  62         setListAdapter(adapter);  63         getListView().setOnScrollListener(this);  64     }  65     public void onScroll(AbsListView v, int firstVisibleItem, int visibleItemCount, int totalItemCount) {   66         lastItem = firstVisibleItem + visibleItemCount - 1 ;  67         System.out.println("lastItem:" + lastItem);  68     }  69     public void onScrollStateChanged(AbsListView v, int state) {  70     if(lastItem == adapter.count && state == OnScrollListener.SCROLL_STATE_IDLE){  71           adapter.count += 10;  72           adapter.notifyDataSetChanged();  73     }  74 //        if(state == OnScrollListener.SCROLL_STATE_IDLE ) {  75 //                adapter.count += 10;  76 //                adapter.notifyDataSetChanged();  77 //        }  78     }  79     class Aleph0 extends BaseAdapter {  80         int count = 10;  81         public int getCount() { return count; }  82         public Object getItem(int pos) { return pos; }  83         public long getItemId(int pos) { return pos; }  84         public View getView(int pos, View v, ViewGroup p) {  85                 TextView view = new TextView(Test.this);  86                 view.setText("entry " + pos);  87                 view.setHeight(90);  88                 return view;  89         }  90     }  91 }  

 

 

第二种。

  1 package com.notice.moredate;  2   3 import java.util.ArrayList;  4 import java.util.HashMap;  5   6 import android.app.Activity;  7 import android.os.Bundle;  8 import android.os.Handler;  9 import android.view.View; 10 import android.view.View.OnClickListener; 11 import android.widget.AbsListView; 12 import android.widget.AbsListView.OnScrollListener; 13 import android.widget.Button; 14 import android.widget.ListView; 15 import android.widget.ProgressBar; 16 import android.widget.SimpleAdapter; 17 import android.widget.Toast; 18  19 public class MoreDateListActivity extends Activity implements OnScrollListener { 20      21     // ListView的Adapter 22     private SimpleAdapter mSimpleAdapter; 23     private ListView lv; 24     private Button bt; 25     private ProgressBar pg; 26     private ArrayList<HashMap<String,String>> list; 27     // ListView底部View 28     private View moreView; 29     private Handler handler; 30     // 设置一个最大的数据条数,超过即不再加载 31     private int MaxDateNum; 32     // 最后可见条目的索引 33     private int lastVisibleIndex; 34      35     /** Called when the activity is first created. */ 36     @Override 37     public void onCreate(Bundle savedInstanceState) { 38         super.onCreate(savedInstanceState); 39         setContentView(R.layout.main); 40          41          42         MaxDateNum = 22; // 设置最大数据条数 43  44         lv = (ListView) findViewById(R.id.lv); 45  46         // 实例化底部布局 47         moreView = getLayoutInflater().inflate(R.layout.moredate, null); 48  49         bt = (Button) moreView.findViewById(R.id.bt_load); 50         pg = (ProgressBar) moreView.findViewById(R.id.pg); 51         handler = new Handler(); 52  53         // 用map来装载数据,初始化10条数据 54         list = new ArrayList<HashMap<String,String>>(); 55         for (int i = 0; i < 10; i++) { 56             HashMap<String, String> map = new HashMap<String, String>(); 57             map.put("ItemTitle", "第" + i + "行标题"); 58             map.put("ItemText", "第" + i + "行内容"); 59             list.add(map); 60         } 61         // 实例化SimpleAdapter 62         mSimpleAdapter = new SimpleAdapter(this, list, R.layout.item, 63                 new String[] { "ItemTitle", "ItemText" }, 64                 new int[] { R.id.tv_title, R.id.tv_content }); 65         // 加上底部View,注意要放在setAdapter方法前 66         lv.addFooterView(moreView); 67         lv.setAdapter(mSimpleAdapter); 68         // 绑定监听器 69         lv.setOnScrollListener(this); 70  71         bt.setOnClickListener(new OnClickListener() { 72  73             @Override 74             public void onClick(View v) { 75                 pg.setVisibility(View.VISIBLE);// 将进度条可见 76                 bt.setVisibility(View.GONE);// 按钮不可见 77  78                 handler.postDelayed(new Runnable() { 79  80                     @Override 81                     public void run() { 82                         loadMoreDate();// 加载更多数据 83                         bt.setVisibility(View.VISIBLE); 84                         pg.setVisibility(View.GONE); 85                         mSimpleAdapter.notifyDataSetChanged();// 通知listView刷新数据 86                     } 87  88                 }, 2000); 89             } 90         }); 91  92     } 93  94     private void loadMoreDate() { 95         int count = mSimpleAdapter.getCount(); 96         if (count + 5 < MaxDateNum) { 97             // 每次加载5条 98             for (int i = count; i < count + 5; i++) { 99                 HashMap<String, String> map = new HashMap<String, String>();100                 map.put("ItemTitle", "新增第" + i + "行标题");101                 map.put("ItemText", "新增第" + i + "行内容");102                 list.add(map);103             }104         } else {105             // 数据已经不足5条106             for (int i = count; i < MaxDateNum; i++) {107                 HashMap<String, String> map = new HashMap<String, String>();108                 map.put("ItemTitle", "新增第" + i + "行标题");109                 map.put("ItemText", "新增第" + i + "行内容");110                 list.add(map);111             }112         }113 114     }115 116     @Override117     public void onScroll(AbsListView view, int firstVisibleItem,118             int visibleItemCount, int totalItemCount) {119         // 计算最后可见条目的索引120         lastVisibleIndex = firstVisibleItem + visibleItemCount - 1;121 122         // 所有的条目已经和最大条数相等,则移除底部的View123         if (totalItemCount == MaxDateNum + 1) {124             lv.removeFooterView(moreView);125             Toast.makeText(this, "数据全部加载完成,没有更多数据!", Toast.LENGTH_LONG).show();126         }127 128     }129 130     @Override131     public void onScrollStateChanged(AbsListView view, int scrollState) {132         // 滑到底部后自动加载,判断listview已经停止滚动并且最后可视的条目等于adapter的条目133         if (scrollState == OnScrollListener.SCROLL_STATE_IDLE134                 && lastVisibleIndex == mSimpleAdapter.getCount()) {135             // 当滑到底部时自动加载136             // pg.setVisibility(View.VISIBLE);137             // bt.setVisibility(View.GONE);138             // handler.postDelayed(new Runnable() {139             //140             // @Override141             // public void run() {142             // loadMoreDate();143             // bt.setVisibility(View.VISIBLE);144             // pg.setVisibility(View.GONE);145             // mSimpleAdapter.notifyDataSetChanged();146             // }147             //148             // }, 2000);149 150         }151 152     }153     154 }

 

listView的分页滑动