ListView上拉到最后一个条目自动刷新

基于公司需求,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();
}

核心代码就是这些,本人水平有限,希望各位前辈多多指正。

demo在此!






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值