使用ListView实现上拉加载更多数据
2016-03-31 11:22
316 查看
之前自己做着玩都是直接把数据显示到手机的一屏上,没考虑过分页功能,刚刚看了一下慕课网ListView分页的视频http://www.imooc.com/learn/136自己做了一下。
1、在ListView底部加一个正在加载的提示布局,因此直接自定义一个LoadListView,继承于ListView,并在构造方法中添加以下代码,为ListView添加底部footer布局。
底部的footer布局如下:
2、检测到用户上拉到屏幕底部的事件,即监听ListView的滚动事件,自定义的LoadListView需要实现OnScrollListener接口,重写两个方法:
并在onScrollStateChanged方法中检测如果此时isLoading为false,则将footer设为可见(LoadListView初始化时footer隐藏),上面代码中的listener是LoadListView中定义的一个接口,用于主界面加载数据的回调,onLoad方法即为该接口中的加载方法,由主界面重写。
3、主界面实现LoadListView的LoadListener接口,重写其onLoad方法,在onLoad方法中,加载更多数据更新数据集list,完成加载后通知LoadListView隐藏footer,并将其加载标志isLoading设置为false。因此在LoadListView中再写一个方法,供主界面的ListView调用。
主界面中:
这里之所以把加载数据的代码放到handler.postDelayed方法中,是因为数据加载太快,footer显示效果不明显,延迟两秒执行主要是为了增加显示过渡效果。
over。
1、在ListView底部加一个正在加载的提示布局,因此直接自定义一个LoadListView,继承于ListView,并在构造方法中添加以下代码,为ListView添加底部footer布局。
private void initView(Context context) { // TODO: 3/31/16 添加底部加载提示布局到ListView LayoutInflater inflater = LayoutInflater.from(context); footer = inflater.inflate(R.layout.footer_layout, null); loadLayout = (LinearLayout) footer.findViewById(R.id.load_layout); loadLayout.setVisibility(GONE); this.addFooterView(footer); }
底部的footer布局如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/load_layout" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="10dp" android:paddingTop="10dp" android:gravity="center"> <ProgressBar style="?android:attr/progressBarStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="正在加载..."/> </LinearLayout> </LinearLayout>
2、检测到用户上拉到屏幕底部的事件,即监听ListView的滚动事件,自定义的LoadListView需要实现OnScrollListener接口,重写两个方法:
@Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { this.lastVisibleItem = firstVisibleItem + visibleItemCount; this.totalItemCount = totalItemCount; } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (totalItemCount == lastVisibleItem && scrollState == SCROLL_STATE_IDLE) { //如果最后一个可见的Item位置等于总的Item数量并且当前滚动停止 if (!isLoading) { isLoading = true; loadLayout.setVisibility(VISIBLE); //加载更多数据 listener.onLoad(); } } }
并在onScrollStateChanged方法中检测如果此时isLoading为false,则将footer设为可见(LoadListView初始化时footer隐藏),上面代码中的listener是LoadListView中定义的一个接口,用于主界面加载数据的回调,onLoad方法即为该接口中的加载方法,由主界面重写。
public void setLoadListener(LoadListener listener) { this.listener = listener; } //加载更多数据的回调接口 public interface LoadListener { void onLoad(); }
3、主界面实现LoadListView的LoadListener接口,重写其onLoad方法,在onLoad方法中,加载更多数据更新数据集list,完成加载后通知LoadListView隐藏footer,并将其加载标志isLoading设置为false。因此在LoadListView中再写一个方法,供主界面的ListView调用。
//数据加载完毕 public void loadCompleted(){ isLoading = false; loadLayout.setVisibility(GONE); }
主界面中:
@Override public void onLoad() { Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { //获取更多数据,通知ListView更新显示界面 getLoadData(); adapter.notifyDataSetChanged(); //通知ListView数据加载完毕 listView.loadCompleted(); } }, 2000); } private void getLoadData() { for (int i = 0; i < 10; i++) { list.add("更多"+strings[i]); } }
这里之所以把加载数据的代码放到handler.postDelayed方法中,是因为数据加载太快,footer显示效果不明显,延迟两秒执行主要是为了增加显示过渡效果。
over。
相关文章推荐
- 完美实现Android ListView中的TextView的跑马灯效果
- android上改变listView的选中颜色
- more、less 和 most 的区别
- Delphi7中Listview的常用功能汇总
- Delphi控件ListView的属性及使用方法详解
- 十万条Access数据表分页的两个解决方法
- sqlserver关于分页存储过程的优化【让数据库按我们的意思执行查询计划】
- 高效的mysql分页方法及原理
- asp又一个分页的代码例子
- SqlServer 2000、2005分页存储过程整理第1/3页
- ADO存取数据库时如何分页显示
- 透彻掌握ASP分页技术很详细的分析
- android中ListView数据刷新时的同步方法
- Android提高之ListView实现自适应表格的方法
- Android中实现水平滑动(横向滑动)ListView示例
- 一条SQL语句搞定Sql2000 分页
- 分页 SQLServer存储过程
- 实现SQL分页的存储过程代码
- sql分页查询几种写法
- SQL行号排序和分页(SQL查询中插入行号 自定义分页的另类实现)