android listview自动加载更多,Android ListView 上拉加载更多

本文介绍如何在Android中自定义ListView实现上拉加载更多的功能。通过继承ListView,利用addFooterView和removeFooterView方法添加和移除加载布局,并在滚动状态改变时判断是否需要加载更多数据。当数据加载完成后,调用OnLoadMoreListener接口通知加载完成。
摘要由CSDN通过智能技术生成

95aae520f548?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

GIF.gif

概述

缕一下思路

既然要实现一个可以上拉刷新的ListView,最简单的就是继承ListView:

1.通过addFooterView方法加载底部布局

2.通过removeFooterView移除布局

3.onScrollStateChanged:

if(最后一条可见item==最后一条item)&&(停止滑动)&&(!加载数据中)&&(!所有条目都可见){

addFooterView();

加载数据;

}

4.监听器OnLoadMoreListener:

if(数据加载完成){

removeFooterVeiw();

}

贴代码

package com.example.xiao.exlistview;

import android.content.Context;

import android.util.AttributeSet;

import android.view.LayoutInflater;

import android.view.View;

import android.widget.AbsListView;

import android.widget.ListView;

/**

* Created by xiao on 2017年3月31日,0031.

*/

public class ExListView extends ListView implements AbsListView.OnScrollListener {

//是否加载中或已加载所有数据

private boolean mIsLoadingOrComplete;

//是否所有条目都可见

private boolean mIsAllVisible;

private OnLoadMoreListener mOnLoadMoreListener;

private View mLoadMoreView;

private View mLoadCompleteView;

public ExListView(Context context) {

super(context);

init(context);

}

public ExListView(Context context, AttributeSet attrs) {

super(context, attrs);

init(context);

}

public ExListView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

init(context);

}

//加载更多回调接口

public interface OnLoadMoreListener {

void loadMore();

}

//初始化

private void init(Context context) {

mLoadMoreView = LayoutInflater.from(context).inflate(R.layout.load_more, null);

mLoadCompleteView = LayoutInflater.from(context).inflate(R.layout.load_complete, null);

setOnScrollListener(this);

}

@Override

public void onScrollStateChanged(AbsListView view, int scrollState) {

//(最后一条可见item==最后一条item)&&(停止滑动)&&(!加载数据中)&&(!所有条目都可见)

if (view.getLastVisiblePosition() == getAdapter().getCount() - 1 && scrollState == SCROLL_STATE_IDLE && !mIsLoadingOrComplete && !mIsAllVisible) {

if (null != mOnLoadMoreListener) {

//加载更多(延时1.5秒,防止加载速度过快导致加载更多布局闪现)

mIsLoadingOrComplete = true;

postDelayed(new Runnable() {

@Override

public void run() {

mOnLoadMoreListener.loadMore();

}

}, 1500);

}

}

if (getFooterViewsCount() == 0 && !mIsAllVisible) addFooterView(mLoadMoreView);

}

@Override

public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

mIsAllVisible = totalItemCount == visibleItemCount;

}

/**

* 加载更多回调

*

* @param onLoadMoreListener 加载更多回调接口

*/

public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {

mOnLoadMoreListener = onLoadMoreListener;

}

/**

* 通知此次加载完成,remove footerView

*

* @param allComplete 是否已加载全部数据

*/

public void setLoadCompleted(final boolean allComplete) {

if (allComplete && getFooterViewsCount() != 0) {

removeFooterView(mLoadMoreView);

removeFooterView(mLoadCompleteView);

addFooterView(mLoadCompleteView);

} else {

mIsLoadingOrComplete = false;

}

}

}

最后

嗯,如果有建议,请多多指教O(∩_∩)O

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值