直接上代码。
其实主要就是通过继承 OnScrollListener 这个接口 在 onScrollStateChanged 这个方法里面 判断listview是否到最后1条。
然后加载数据,下面部分代码。
public class MainActivity extends Activity implements OnScrollListener { private ArrayAdapter adapter; private ListView listView; private TextView loadText; private ProgressBar pg; private List<String> list; // ListView底部View private View moreView; private Handler handler = new Handler(); private int MaxNum = 22;// 设置一个最大的数据条数,超过即不再加载 // 最后可见条目的索引 private int lastVisibleIndex; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.ll); moreView = getLayoutInflater().inflate(R.layout.moredata, null); loadText = (TextView) moreView.findViewById(R.id.bt_load); pg = (ProgressBar) moreView.findViewById(R.id.pg); listView.addFooterView(moreView); // 用map来装载数据,初始化10条数据 list = new ArrayList<String>(); // 实例化SimpleAdapter adapter= new ArrayAdapter(this, R.layout.item, R.id.tv_title, list); listView.setAdapter(adapter); listView.setOnScrollListener(this); loadDate(); /** 手动加载 **/ // loadText.setOnClickListener(new OnClickListener() { // @Override // public void onClick(View v) { // pg.setVisibility(View.VISIBLE);// 将进度条可见 // loadText.setVisibility(View.GONE);// 按钮不可见 // handler.postDelayed(new Runnable() { // @Override // public void run() { // loadDate(); // loadText.setVisibility(View.VISIBLE); // pg.setVisibility(View.GONE); // adapter.notifyDataSetChanged();// 通知listView刷新数据 // } // }, 2000); // } // }); } /** 说明一下 * onScroll 是滑动后触发的 * onScrollStateChanged 是拖着滑动触发 * */ @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // 计算最后可见条目的索引 lastVisibleIndex = firstVisibleItem + visibleItemCount - 1; // 所有的条目已经和最大条数相等,则移除底部的View if (totalItemCount == MaxNum + 1) { listView.removeFooterView(moreView); Toast.makeText(this, "数据全部加载完成", Toast.LENGTH_LONG).show(); } } //滑动的时候判断是否已经到了底部。 @Override public void onScrollStateChanged(AbsListView view, int scrollState) { //OnScrollListener.SCROLL_STATE_TOUCH_SCROLL //OnScrollListener.SCROLL_STATE_FLING //OnScrollListener.SCROLL_STATE_IDLE if (scrollState == OnScrollListener.SCROLL_STATE_IDLE && lastVisibleIndex == adapter.getCount()) { // 当滑到底部时自动加载 pg.setVisibility(View.VISIBLE); loadText.setVisibility(View.GONE); handler.postDelayed(new Runnable() { @Override public void run() { loadDate(); loadText.setVisibility(View.VISIBLE); pg.setVisibility(View.GONE); adapter.notifyDataSetChanged(); } }, 2000); } } //这里加载数据 private void loadDate(){ int count = adapter.getCount(); // if (count + 5 < MaxNum) { // for (int i = count; i < count + 5; i++) { // list.add("新增第" + i + "行"); // } // } else { // for (int i = count; i < MaxNum; i++) { // list.add("新增第" + i + "行"); // } // } //一次加载10条 for (int i = count; i < count + 20; i++) { list.add("新增第" + i + "行"); } } }
几个工程:
1. 上面那个简单的 上拉加载更多的例子
http://download.csdn.net/detail/kongbaidepao/6884945
2. 网上的一个 上拉加载更多 下拉刷新的例子
http://download.csdn.net/detail/kongbaidepao/6884933
3. 还有1个挺完善的 listview scrollview gridview 加载更多的例子
http://download.csdn.net/detail/kongbaidepao/6884999
另外附一个开源项目,有兴趣的可以去看看呢。
https://github.com/chrisbanes/Android-PullToRefresh