基本的原理和我的上一篇随笔“Android之下拉刷新ListView”差不多,代码里面有注释,这里就不废话了,直接上代码。

自定义的分页显示ListView——PagedListView.java代码如下:

 public class PagedListView extends ListView implements OnScrollListener {
     private View footer; // 底部布局
     private LayoutInflater inflater;
     private int totalItemCount; // 总的Item的数量
     private int lastVisibleItemIndex; // 最后一个可见的Item的索引
     private boolean isLoading; // 是否正在加载
     private ListViewLoadListener listener; // 加载更多数据的回掉接口

     public PagedListView(Context context) {
         this(context, null);
     }

     public PagedListView(Context context, AttributeSet attrs) {
         this(context, attrs, 0);
     }

     public PagedListView(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
         initView(context);
     }

     // 加载底部布局到ListView中
     private void initView(Context context) {
         inflater = LayoutInflater.from(context);
         footer = inflater.inflate(R.layout.sideworks_layout_footer, null);
         footer.findViewById(R.id.control_layout_footer).setVisibility(View.GONE);
         this.addFooterView(footer);
         this.setOnScrollListener(this);
     }

     @Override
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
         this.lastVisibleItemIndex = firstVisibleItem + visibleItemCount;
         this.totalItemCount = totalItemCount;
     }

     @Override
     public void onScrollStateChanged(AbsListView view, int scrollState) {
         if (totalItemCount == lastVisibleItemIndex && scrollState == SCROLL_STATE_IDLE) {
             if (!isLoading) {
                 isLoading = true;
                 footer.findViewById(R.id.control_layout_footer).setVisibility(View.VISIBLE);
                 listener.loadData(); // 调用接口中的回调方法进行数据更新
             }
         }
     }

     // 加载更多数据的回掉接口
     public interface ListViewLoadListener {
         public void loadData();
     }

     public void setListViewLoadInterface(ListViewLoadListener listener) {
         this.listener = listener;
     }

     // 数据加载完成之后,隐藏footer布局
     public void onLoadComplete() {
         isLoading = false;
         footer.findViewById(R.id.control_layout_footer).setVisibility(View.GONE);
     }
 }

底部布局sideworks_layout_footer.xml的代码如下:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content" >

     <!-- 这里必须要套一层LinearLayout,不然在代码中设置Visibility为Gone时底部总是会有一部分空白区域 -->
     <LinearLayout
         android:id="@+id/control_layout_footer"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:background="#e7e7e7"
         android:gravity="center"
         android:orientation="horizontal"
         android:paddingBottom="10.0dip"
         android:paddingTop="10.0dip" >

         <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:layout_marginLeft="15.0dip"
             android:text="@string/str_footer_tip"
             android:textColor="#777777" />
     </LinearLayout>

 </LinearLayout>

主页面布局activity_main.xml代码如下:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent" >

     <com.view.PagedListView
         android:id="@+id/control_main_listview"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />

 </RelativeLayout>

主界面MainActivity.java代码如下:

 public class MainActivity extends Activity implements ListViewLoadListener {
     private PagedListView listView;
     private ArrayAdapter<String> listAdapter;
     private List<String> listData;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         initView();
     }

     private void initView() {
         listView = (PagedListView) findViewById(R.id.control_main_listview);
         listView.setListViewLoadInterface(this);
         listData = new ArrayList<String>();
         for (int i = 0; i < 10; i++) {
             listData.add("This is an initial data.");
         }
         listAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_expandable_list_item_1, listData);
         listView.setAdapter(listAdapter);
     }

     @Override
     public void loadData() {
         new Handler().postDelayed(new Runnable() {
             public void run() {
                 // 增加两条数据并通知ListView进行数据的更新
                 for (int i = 0; i < 2; i++) {
                     listData.add("This is a new data.");
                 }
                 listAdapter.notifyDataSetChanged();
                 listView.onLoadComplete();
             }
         }, 2000);
     }
 }

Android之分页加载数据的更多相关文章

  1. java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单

    一.widget:桌面小控件1 写一个类extends AppWidgetProvider 2 在清单文件件中注册: <receiver android:name=".ExampleA ...

  2. Android中ListView分页加载数据

    public class MainActivity extends Activity { private ListView listView=null; //listview的数据填充器 privat ...

  3. 【Android进阶】Listview分页加载数据的实现

    Listview分页加载数据的实现 public class MainActivity extends Activity { protected static final int SUCCESS_GE ...

  4. jQuery 滚动条 滚动到底部(下拉到底部) 加载数据(触发事件、处理逻辑)、分页加载数据

    1.针对浏览器整个窗口滚动 主要代码: <script type="text/javascript"> ; function GetProductListPageFun ...

  5. Android ListView分页加载时图片显示问题

    场景:Android ListView需要分页加载,每个item中会有图片,图片又是从网络下载的. 问题:在滑动加载下一页时,上一页的图片明明已经下载完成了,但是无法显示出来. Bug重现: 1,加载 ...

  6. listView 分页加载数据

    Android应用 开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页 的形式来展示数据,个人觉得这样会有 ...

  7. Android开发ListView使用OnScrollListener实现分页加载数据

    上篇博文和大家分享了下拉刷新,这是一个用户体验很好的操作方式.新浪微薄就是使用这样的方式的典型. 还有个问题,当用户从网络上读取微薄的时候.假设一下子所有载入用户未读的微薄这将耗费比較长的时间,造成不 ...

  8. Android ListView异步加载数据

    1.主Activity public class MainActivity extends Activity { private ListView listView; private ArrayLis ...

  9. SrcollView分页加载数据(第二种方法 自定义listView)

    package com.baidu.ms; import android.content.Context;import android.util.AttributeSet;import android ...

随机推荐

  1. 二分 题目 压缩打包 Special Judge? 不不不 当然不是

    http://noi.openjudge.cn/ch0111/ No 题目 分数 01 查找最接近的元素 10 3176 02 二分法求函数的零点 10 2181 03 矩形分割 10 1420 04 ...

  2. [osx] 查看端口被占用

    netstat命令 netstat -an | grep 3306 3306替换成需要grep的端口号 lsof命令 sudo lsof -i :80 -i参数表示网络链接,:80指明端口号,该命令会 ...

  3. [Vuejs] 关于vue-router里面的subRoutes

    刚学习vue,可能有使用不对的地方,希望没有对大家造成困扰! 使用vue-router,为了能够更好的管理.vue文件,需要用到子路由. 先看个错误的例子 routers.js '/company': ...

  4. Java里面,反射父类里面数字类型字段,怎么set值

    Java里面,反射父类里面数字类型字段,怎么set值,我的做法是这样: /** * TODO 直接设置对象属性值, 忽略private/protected 修饰符, 也不经过setter * @aut ...

  5. mac上远程连接windows

    Microsoft 适用于 Mac 的远程桌面连接客户端 2.1.1 http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=1814 ...

  6. Untiy3D - 窗口界面2

    Component 组件 Mesh:网格 Mesh Filter: 网格滤镜 Mesh Renderer 网格渲染器 Mesh Collider: 网格碰撞器.网格碰撞节点 Convex: 凸的.凸面 ...

  7. jni学习

    Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机(VM) 内部运行的 ...

  8. javascript 正则表达式(二)

    /* 正则表达式方法:test(),exec(),String对象方法:match(),search(),replace(),split() 1.test()方法: 用法:  regexp对象实例.t ...

  9. SSIS 组件点滴

    一 Sort组件 Sort组件是用来排序,我们在做join时也必须进行排序,排序的键值作为数据源关联的key 而在sort组件中有一个选项“Remove Rows with duplicate sor ...

  10. js判断滚动方向

     //页面滚动监听事件     window.onscroll = function (e) {                scrollFunc();         $("#t&quo ...