Android自定义ListView(二) - 可上拉加载的ListView(即具有分页功能的ListView)
2016-06-10 11:54
537 查看
在我的上一篇博客中(大家感兴趣的可以看一下我的上一篇博客Android自定义ListView(一) - 可下拉刷新的ListView),与大家一起分享了可下拉刷新的ListView,原理还是很简单的,今天与大家一起分享可上拉加载的ListView(即具有分页功能的ListView),我个人感觉这个可上拉加载的ListView,其实现起来比下拉刷新的ListView更加简单,相信如果你已经掌握的可下拉刷新的ListView,实现可上拉加载的ListView不具有任务困难。
首先说明一下,这里实现的可上拉加载的ListView是在在上一个可下拉刷新的ListView的工程里完成的,只是我单独新建了一个ListView-------LoadListView,为了简化代码,我并没有集成到上一篇博客中完成的PullToRefreshListView,如果读者感兴趣,可以自已集成一 个既可下拉刷新,又可上拉加载的ListView,下一步,我也会将这两部分合并。
好了,先看一下效果图:
下面粘上主要的代码:
下面是MainActivity1的代码,待会如果要下载代码运行看一下效果的朋友们请注意:MainActivity对应的是PullToRefreshListView,
至于Adapter的代码与上一篇博客中的Adapter一样。
最后,一个可以上拉加载的ListView就完成了,下面附上所有代码的下载地址:
下载地址
首先说明一下,这里实现的可上拉加载的ListView是在在上一个可下拉刷新的ListView的工程里完成的,只是我单独新建了一个ListView-------LoadListView,为了简化代码,我并没有集成到上一篇博客中完成的PullToRefreshListView,如果读者感兴趣,可以自已集成一 个既可下拉刷新,又可上拉加载的ListView,下一步,我也会将这两部分合并。
好了,先看一下效果图:
下面粘上主要的代码:
package com.ssa.pulltorefreshlistview; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.AbsListView; import android.widget.ListView; import android.widget.AbsListView.OnScrollListener; ; public class LoadListView extends ListView implements OnScrollListener { private View mFooter; private int mTotalItemCount; private int mLastVisibleItem; private boolean isLoading; private ILoadListener mLoadListener; public LoadListView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } /** * 添加底部布局 * @param context */ private void initView(Context context) { LayoutInflater inflater = LayoutInflater.from(context); mFooter = inflater.inflate(R.layout.footer_item, null); mFooter.findViewById(R.id.ll_container).setVisibility(View.GONE); this.addFooterView(mFooter); this.setOnScrollListener(this); } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { //当ListView最后一个Item的序号与ListView所有Item的数量相等,并且此时滚动状态处于闲置,空闲时,执行加载数据的逻辑 if (mTotalItemCount == mLastVisibleItem && scrollState == SCROLL_STATE_IDLE) { if (!isLoading) { mFooter.findViewById(R.id.ll_container).setVisibility(View.VISIBLE); isLoading = true; //加载更多数据 this.mLoadListener.onLoad(); } } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //这里是上拉加载实现的关键,firstVisibleItem,为ListView可见的第一个Item的序号,visibleItemCount为可见Item的数量, //二者相加就是可见最后一个Item的序号,而totalItemCount是ListView所有的Item的数量。 this.mLastVisibleItem = firstVisibleItem + visibleItemCount; this.mTotalItemCount = totalItemCount; } public void setLoadListener(ILoadListener listener) { this.mLoadListener = listener; } public void loadComplete() { mFooter.findViewById(R.id.ll_container).setVisibility(View.GONE); isLoading = false; } /** * 加载更多数据回调接口 */ public interface ILoadListener { void onLoad(); } }
下面是MainActivity1的代码,待会如果要下载代码运行看一下效果的朋友们请注意:MainActivity对应的是PullToRefreshListView,
package com.ssa.pulltorefreshlistview; import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import com.ssa.pulltorefreshlistview.LoadListView.ILoadListener; public class MainActivity1 extends Activity implements ILoadListener { private LoadListView mLoadListView; private ListViewAdapter mAdapter; private ArrayList<String> mDatas; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main1); initUI(); } private void initUI() { mLoadListView = (LoadListView) findViewById(R.id.lv_refresh); mLoadListView.setLoadListener(this); mAdapter = new ListViewAdapter(this); mDatas = new ArrayList<String>(); mAdapter.setDataSources(mDatas); mLoadListView.setAdapter(mAdapter); String str = getResources().getString(R.string.list_view_data); for (int i = 0; i < 30; i++) { mDatas.add(String.format(str, i)); } } @Override public void onLoad() { Handler handler = new Handler(); //模拟网络请求的延迟时间 handler.postDelayed(new Runnable() { @Override public void run() { String str = getResources().getString(R.string.list_view_data_refresh); for (int i = 0; i < 2; i++) { mDatas.add(mDatas.size(), String.format(str, i)); } mAdapter.notifyDataSetChanged(); mLoadListView.loadComplete(); } }, 2000); } }
至于Adapter的代码与上一篇博客中的Adapter一样。
最后,一个可以上拉加载的ListView就完成了,下面附上所有代码的下载地址:
下载地址
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories