基于公司需求,ListView列表只需再滑动到最后一个条目时自动加载更多,这里实现一个简单的demo共以后使用。
首先分析刷新原理:
刷新借助BaseAdapter类的notifyDataSetChanged()发发实现,实现方法实在自己的Adapter中暴露刷新方法,代码如下所示:
/*刷新数据*/
public void updateData(List<DataBean> dataList){
if(mDataList != null){
mDataList.clear();
mDataList.addAll(dataList);
}
notifyDataSetChanged();
}
调用刷新方法之前注意清空数据集合中的数据,将新的数据集合添加到原来的数据集合中。这里需要注意一点,不要使用以下代码更新数据集合:
public void updateData(List<DataBean> dataList){
if(mDataList != null){
mDataList.clear();
this.mDataList = dataList;
}
notifyDataSetChanged();
}
这样可能无法实现数据集合的更新,因为notifyDataSetChanged()刷新的是最开始得到数据集合,而上述代码使用“=”将改变原来数据集合引用的指向。
接下来介绍如何实现滑动到最后一个条目自动刷新以及给listview添加footerview:
实现滑动到最后一个条目自动刷新,我们要去监听listview的滑动状态,因此我们要给listview注册滑动监听,并重写onScroll和onScrollStateChanged方法,代码如下:
@Override
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
mLastIndex = firstVisibleItem + visibleItemCount;
mTotalIndex = totalItemCount;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(mLastIndex == mTotalIndex && (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE)){
//表示此时需要显示刷新视图界面进行新数据的加载(要等滑动停止)
if(mCurrentPageCount < mTotalPageCount){
loadMoreData();
/}else {
mNomoreTv.setVisibility(View.VISIBLE);
mLoadingTv.setVisibility(View.GONE);
}
}
}
添加footerview布局的作用是在当前加载的最后一条数据显示时下边显示“正在加载”或者“再无更多”,这样能够带给用户更好的体验。
mListView.addFooterView(mFooterView);//添加footerview
需要对footerview进行管理:
footerview中有两个listview分别显示“暂无更多”和“正在加载”,在分页数据全部加载完毕后显示“暂无更多”,加载数据时显示“正在加载”,分别在onScrollStateChanged和
loadMoreData两个方法中进行控制,代码如下:
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(mLastIndex == mTotalIndex && (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE)){
//表示此时需要显示刷新视图界面进行新数据的加载(要等滑动停止)
if(mCurrentPageCount < mTotalPageCount){
loadMoreData();
/}else {
mNomoreTv.setVisibility(View.VISIBLE);
mLoadingTv.setVisibility(View.GONE);
}
}
}
/*加载新数据*/
private void loadMoreData(){
mNewDataList = new ArrayList<DataBean>();
//设置刷新界面可见
mNomoreTv.setVisibility(View.GONE);
mLoadingTv.setVisibility(View.VISIBLE);
//模拟耗时加载新数据
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
mNewDataList.addAll(mFirstDataList);
for(int i = 0;i < 20;i++){
DataBean mDataBean = new DataBean();
String itemData = "刷新之后第" + i + "条数据";
mDataBean.setItemId(i+"");
mDataBean.setItemData(itemData);
mNewDataList.add(mDataBean);
}
Message msg = Message.obtain();
msg.what = 1;
handler.sendMessage(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
核心代码就是这些,本人水平有限,希望各位前辈多多指正。