基本的原理和我的上一篇随笔“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. 继承AppCompatActivity的Activity隐藏标题栏

    继承了AppCompatActivity的Activity无法通过调用requestWindowFeature(Window.FEATURE_NO_TITLE)来隐藏标题栏. public class ...

  2. idea开发工具破解地址

    链接失效可以使用激活码.激活码不需要联网也可以开发. idea 在注册时选择 License server ,填http://idea.iteblog.com/key.php ,然后点击激活. 激活码 ...

  3. android-async-http AsyncHttpClient介绍

    前一阵子刚搬了家,加上公司要发新版本,所以一直比较忙,文章也好几周没更新了.难得这个周末有空,正好周内偶然间闲逛 发现这个很不错的第三方开源类库,针对Android开发中发送http请求的. 在And ...

  4. 浅谈rem、em、px

    1.px:像素(Pixel) px是相对长度单位,他是相对于显示器屏幕分辨率而言的 优点:比较稳定.精确 缺点:在浏览器 中放大或者缩小浏览页面,会出现页面混乱的情况. 如下例子: .buttonPX ...

  5. Python list列表的排序

    当我们从数据库中获取一写数据后,一般对于列表的排序是经常会遇到的问题,今天总结一下python对于列表list排序的常用方法: 第一种:内建函数sort() 这个应该是我们使用最多的也是最简单的排序函 ...

  6. 腾讯信鸽推送Android SDK快速指南

    信鸽Android SDK是一个能够提供Push服务的开发平台,提供给开发者简便.易用的API接口,方便快速接入.目前支持Android 2.2及以上版本系统.本文档将引导用户以最快的速度嵌入信鸽SD ...

  7. go sample-base64

    GoSample-base64 package mainimport ( "encoding/base64" "fmt")func base64Encode(s ...

  8. 整理一下以前的Html+css3复习笔记

    一.html5新特性  常用语义标签:nav footer header section mark  功能标签 video audio iframe canvas(画布和绘图功能)  input新ty ...

  9. C#开发COM组件

    1.每个COM组件所有对外公布的方法都必须通过接口形式实现: 2.由于.Net下编译的COM组件并等同于C编译的COM组件,所以存在必须在运行目标机器注册的情况,对此.Net下编译的COM组件必须为程 ...

  10. Spring 事务配置的几种方式

    参考:http://www.blogjava.net/robbie/archive/2009/04/05/264003.html http://www.cnblogs.com/appleat/arch ...