您的位置:首页 > 移动开发 > Android开发

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,下一步,我也会将这两部分合并。

好了,先看一下效果图:

        


        下面粘上主要的代码:

        

        

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就完成了,下面附上所有代码的下载地址:

下载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息