基本的原理和我的上一篇随笔“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. Android GridView 分页加载数据

    android UI 往右滑动,滑动到最后一页就自动加载数据并显示 如图: package cn.anycall.ju; import java.util.ArrayList; import java ...

  2. android ListView 分页加载数据

    1.mainActivity <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...

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

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

  4. Android中ListView分页加载数据

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

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

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

  6. android 网络异步加载数据进度条

    ProgressDialog progressDialog = null; public static final int MESSAGETYPE = 0; private void execute( ...

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

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

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

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

  9. listView 分页加载数据

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

随机推荐

  1. mysql中的多行查询结果合并成一个

    SELECT GROUP_CONCAT(md.data1) FROM DATA md,contacts cc WHERE md.conskey=cc.id AND md.mimetype_id= 5 ...

  2. 5-4 bash脚本编程之三 条件判断及算术运算

    1. 反引号是引用执行结果,并非是返回值 如下是错误的,结果是一行行记录,不是返回值 放大为: 练习 2. shell中如何进行算术运算 A=3 B=4 1. let算术运算表达式 2. $[算术运算 ...

  3. WinXP/Win7/Win8本地用户配置文件迁移至域用户

    一.概述 最近在进行加域的工作,PC大部分是Win7,使用过微软USMT 4.0和5.0工具进行迁移,但命令行报错,目前还没找到好的文章研究. 本文迁移方法很特殊,利用的是Windows默认配置文件. ...

  4. 安装Appium-windows

    安装Appium-windows JDK 安装JDK后设置 环境变量,把环境变量添加到你的系统PATH变量中. 变量: JAVA_HOME 值: C:\Program Files (x86)\Java ...

  5. S5PV210_流水灯

    1.整体思路:把相应的配置数据写入相应的寄存器,控制GPIO电平(Led.s)——运用工程管理Makefile编译.链接文件(由Led.s编译得到led.bin,该文件用于USB启动方式点亮LED,若 ...

  6. 浅谈 C++ 中的 new/delete 和 new[]/delete[]

    在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢? new 和 delete 是函数吗? new [] 和 delete [] 又是什么?什么时候 ...

  7. JS和JSON的区别

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,JSON格式的数据,主要是为了跨平台交流数据用的.但JSON和JavaScript确实存在渊源,可以说这种数 ...

  8. jetbrain系列IDE设置

    1.代码提示默认ctrl+space(这是全角半角切换),改为alt+/,这与cyclic expand word冲突,直接删掉它就可以了 2.ctrl+M,进入presentation mode,与 ...

  9. 使用EXtjs6.2构建web项目

    一.项目简介 众所周知ext是一款非常强大的表格控件,尤其是里边的grid为用户提供了非常多的功能,现在主流的还是用extjs4.0-4.2,但是更高一点的版本更加符合人的审美要求.因此,在今天咱们构 ...

  10. 修改hosts文件在本地使域名解析到指定IP

    # Additionally, comments (such as these) may be inserted on individual  # lines or following the mac ...