Android之分页加载数据
基本的原理和我的上一篇随笔“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之分页加载数据的更多相关文章
- Android GridView 分页加载数据
android UI 往右滑动,滑动到最后一页就自动加载数据并显示 如图: package cn.anycall.ju; import java.util.ArrayList; import java ...
- android ListView 分页加载数据
1.mainActivity <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...
- java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单
一.widget:桌面小控件1 写一个类extends AppWidgetProvider 2 在清单文件件中注册: <receiver android:name=".ExampleA ...
- Android中ListView分页加载数据
public class MainActivity extends Activity { private ListView listView=null; //listview的数据填充器 privat ...
- 【Android进阶】Listview分页加载数据的实现
Listview分页加载数据的实现 public class MainActivity extends Activity { protected static final int SUCCESS_GE ...
- android 网络异步加载数据进度条
ProgressDialog progressDialog = null; public static final int MESSAGETYPE = 0; private void execute( ...
- jQuery 滚动条 滚动到底部(下拉到底部) 加载数据(触发事件、处理逻辑)、分页加载数据
1.针对浏览器整个窗口滚动 主要代码: <script type="text/javascript"> ; function GetProductListPageFun ...
- Android ListView分页加载时图片显示问题
场景:Android ListView需要分页加载,每个item中会有图片,图片又是从网络下载的. 问题:在滑动加载下一页时,上一页的图片明明已经下载完成了,但是无法显示出来. Bug重现: 1,加载 ...
- listView 分页加载数据
Android应用 开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页 的形式来展示数据,个人觉得这样会有 ...
随机推荐
- 萌新笔记——git的问题(error: object file .git/objects/* is empty...)的解决方案及对git版本库文件的了解
由于操作不当,导致git版本库出了大问题,如下所示: error: object file .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e ...
- WinformWPF 多线程访问控件【转】
大家知道WPF中多线程访问UI控件时会提示UI线程的数据不能直接被其他线程访问或者修改,该怎样来做呢? 分下面两种情况 1.WinForm程序 )第一种方法,使用委托: private delegat ...
- ubuntu 14.04 配置 jdk1.8
自己在Ubuntu中安装jdk1.8的步骤,记录以方便以后查询. 将下载好的jdk安装包移到/usr/local目录中(我喜欢将自己安装的软件放在/usr/local目录中),解压缩 sudo tar ...
- float4与half4数据类型
连续4个32位float类型数的向量 HLSL数据类型 GPU是以四维向量为基本单位来计算的.4个浮点数所组成的float4向量是GPU内置的最基本类型.使用GPU对两个float4向量进行计算,与C ...
- JavaScript 汉字与拼音互转终极方案 附JS拼音输入法
转:http://www.codeceo.com/article/javascript-pinyin.html 前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的 ...
- linux重启mysql无法启动
如VPS新建后,重启则无法启动,出现类似 Starting MySQL ... * The server quit without updating PID file (/var/run/mysqld ...
- Lua的协程和协程库详解
我们首先介绍一下什么是协程.然后详细介绍一下coroutine库,然后介绍一下协程的简单用法,最后介绍一下协程的复杂用法. 一.协程是什么? (1)线程 首先复习一下多线程.我们都知道线程——Thre ...
- 搭建一套自己实用的.net架构(3)【ORM-Dapper+DapperExtensions】
现在成熟的ORM比比皆是,这里只介绍Dapper的使用(最起码我在使用它,已经运用到项目中,小伙伴们反馈还可以). 优点: 1.开源.轻量.小巧.上手容易. 2.支持的数据库还蛮多的, Mysql,S ...
- [LeetCode] Range Sum Query 2D - Immutable 二维区域和检索 - 不可变
Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...
- Ajax状态值及状态码
1- AJAX状态值与状态码区别AJAX状态值是指,运行AJAX所经历过的几种状态,无论访问是否成功都将响应的步骤,可以理解成为AJAX运行步骤.如:正在发送,正在响应等,由AJAX对象与服务器交互时 ...