public class PulmListView extends ListView {
public PulmListView(Context context) {
this(context, null);
}
public PulmListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public PulmListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// 初始化
init();
}
}
private void init() {
super.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// 调用用户设置的OnScrollListener
if (mUserOnScrollListener != null) {
mUserOnScrollListener.onScrollStateChanged(view, scrollState);
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// 调用用户设置的OnScrollListener
if (mUserOnScrollListener != null) {
mUserOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
}
// firstVisibleItem是当前屏幕能显示的第一个元素的位置
// visibleItemCount是当前屏幕能显示的元素的个数
// totalItemCount是ListView包含的元素总数
int lastVisibleItem = firstVisibleItem + visibleItemCount;
if (!mIsLoading && !mIsPageFinished && lastVisibleItem == totalItemCount) {
if (mOnPullUpLoadMoreListener != null) {
mIsLoading = true;
mOnPullUpLoadMoreListener.onPullUpLoadMore();
}
}
}
});
}
/**
* 加载更多的View布局,可自定义.
*/
public class LoadMoreView extends LinearLayout {
public LoadMoreView(Context context) {
this(context, null);
}
public LoadMoreView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LoadMoreView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
LayoutInflater.from(getContext()).inflate(R.layout.lv_load_more, this);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/id_load_more_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center"
android:layout_margin="@dimen/loading_view_margin_layout">
<ProgressBar
android:id="@+id/id_loading_progressbar"
android:layout_width="@dimen/loading_view_progress_size"
android:layout_height="@dimen/loading_view_progress_size"
android:indeterminate="true"
style="?android:progressBarStyleSmall"/>
<TextView
android:id="@+id/id_loading_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/page_loading"/>
</LinearLayout>
private View mLoadMoreView;
private void init() {
mLoadMoreView = new LoadMoreView(getContext());
}
private void init() {
mIsLoading = false; // 初始化时没处于加载状态
mIsPageFinished = false; // 初始化时默认还有更多数据需要加载
mLoadMoreView = new LoadMoreView(getContext()); // 实例化FooterView
super.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// 调用用户设置的OnScrollListener
if (mUserOnScrollListener != null) {
mUserOnScrollListener.onScrollStateChanged(view, scrollState);
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// 调用用户设置的OnScrollListener
if (mUserOnScrollListener != null) {
mUserOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
}
int lastVisibleItem = firstVisibleItem + visibleItemCount;
// 当处于ListView尾部且有更多数据需要加载且当前没有加载程序再进行中时, 执行加载更多操作
if (!mIsLoading && !mIsPageFinished && lastVisibleItem == totalItemCount) {
if (mOnPullUpLoadMoreListener != null) {
mIsLoading = true; // 将加载更多进行时状态设置为true
showLoadMoreView(); // 显示加载更多布局
mOnPullUpLoadMoreListener.onPullUpLoadMore(); // 调用用户设置的加载更多回调接口
}
}
}
});
}
private void showLoadMoreView() {
// 这里将加载更多的根布局id设置为id_load_more_layout, 便于用户自定制加载更多布局.
if (findViewById(R.id.id_load_more_layout) == null) {
addFooterView(mLoadMoreView);
}
}
/**
* 加载更多结束后ListView回调方法.
*
* @param isPageFinished 分页是否结束
* @param newItems 分页加载的数据
* @param isFirstLoad 是否第一次加载数据(用于配置下拉刷新框架使用, 避免出现页面闪现)
*/
public void onFinishLoading(boolean isPageFinished, List<?> newItems, boolean isFirstLoad) {
mIsLoading = false; // 标记当前已经没有加载更多的程序在执行
setIsPageFinished(isPageFinished); // 设置分页是否结束标志并移除FooterView
}
private void setIsPageFinished(boolean isPageFinished) {
mIsPageFinished = isPageFinished;
removeFooterView(mLoadMoreView);
}
/**
* 上拉加载更多的回调接口
*/
public interface OnPullUpLoadMoreListener {
void onPullUpLoadMore();
}
private OnPullUpLoadMoreListener mOnPullUpLoadMoreListener;
/**
* 设置上拉加载更多的回调接口.
* @param l 上拉加载更多的回调接口
*/
public void setOnPullUpLoadMoreListener(OnPullUpLoadMoreListener l) {
this.mOnPullUpLoadMoreListener = l;
}
/**
* 抽象的Adapter.
*/
public abstract class PulmBaseAdapter<T> extends BaseAdapter {
protected List<T> items;
public PulmBaseAdapter() {
this.items = new ArrayList<>();
}
public PulmBaseAdapter(List<T> items) {
this.items = items;
}
public void addMoreItems(List<T> newItems, boolean isFirstLoad) {
if (isFirstLoad) {
this.items.clear();
}
this.items.addAll(newItems);
notifyDataSetChanged();
}
public void removeAllItems() {
this.items.clear();
notifyDataSetChanged();
}
}
/**
* 加载更多结束后ListView回调方法.
*
* @param isPageFinished 分页是否结束
* @param newItems 分页加载的数据
* @param isFirstLoad 是否第一次加载数据(用于配置下拉刷新框架使用, 避免出现页面闪现)
*/
public void onFinishLoading(boolean isPageFinished, List<?> newItems, boolean isFirstLoad) {
mIsLoading = false;
setIsPageFinished(isPageFinished);
// 添加更新后的数据
if (newItems != null && newItems.size() > 0) {
PulmBaseAdapter adapter = (PulmBaseAdapter) ((HeaderViewListAdapter) getAdapter()).getWrappedAdapter();
adapter.addMoreItems(newItems, isFirstLoad);
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有