Android之LoadMoreListView

java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/**
* Android load more ListView when scroll down.
*
* @author Charon Chui
*/
public class LoadMoreListView extends ListView {
protected static final String TAG = "LoadMoreListView";
private View mFooterView;
private OnScrollListener mOnScrollListener;
private OnLoadMoreListener mOnLoadMoreListener;
/**
* If is loading now.
*/
private boolean mIsLoading;
private int mCurrentScrollState;
public LoadMoreListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public LoadMoreListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public LoadMoreListView(Context context) {
super(context);
init(context);
}
private void init(Context context) {
mFooterView = View.inflate(context, R.layout.load_more_footer, null);
addFooterView(mFooterView);
hideFooterView();
/*
* Must use super.setOnScrollListener() here to avoid override when call
* this view's setOnScrollListener method
*/
super.setOnScrollListener(superOnScrollListener);
}
/**
* Hide the load more view(footer view)
*/
private void hideFooterView() {
mFooterView.setVisibility(View.GONE);
}
/**
* Show load more view
*/
private void showFooterView() {
mFooterView.setVisibility(View.VISIBLE);
}
@Override
public void setOnScrollListener(OnScrollListener l) {
mOnScrollListener = l;
}
/**
* Set load more listener, usually you should get more data here.
*
* @param listener
* OnLoadMoreListener
* @see OnLoadMoreListener
*/
public void setOnLoadMoreListener(OnLoadMoreListener listener) {
mOnLoadMoreListener = listener;
}
/**
* When complete load more data, you must use this method to hide the footer
* view, if not the footer view will be shown all the time.
*/
public void onLoadMoreComplete() {
mIsLoading = false;
hideFooterView();
}
private OnScrollListener superOnScrollListener = new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
mCurrentScrollState = scrollState;
// Avoid override when use setOnScrollListener
if (mOnScrollListener != null) {
mOnScrollListener.onScrollStateChanged(view, scrollState);
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (mOnScrollListener != null) {
mOnScrollListener.onScroll(view, firstVisibleItem,
visibleItemCount, totalItemCount);
}
// The count of footer view will be add to visibleItemCount also are
// added to totalItemCount
if (visibleItemCount == totalItemCount) {
// If all the item can not fill screen, we should make the
// footer view invisible.
hideFooterView();
} else if (!mIsLoading
&& (firstVisibleItem + visibleItemCount >= totalItemCount)
&& mCurrentScrollState != SCROLL_STATE_IDLE) {
showFooterView();
mIsLoading = true;
if (mOnLoadMoreListener != null) {
mOnLoadMoreListener.onLoadMore();
}
}
}
};
/**
* Interface for load more
*/
public interface OnLoadMoreListener {
/**
* Load more data.
*/
void onLoadMore();
}
`

load_more_footer.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal" >
<ProgressBar
android:id="@+id/load_more_pb"
style="@android:style/Widget.ProgressBar.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp" />
<TextView
android:id="@+id/load_more_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="5dp"
android:paddingTop="5dp"
android:text="正在加载..."
tools:ignore="HardcodedText" />
</LinearLayout>

调用

1
2
3
4
5
6
7
mListView.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
public void onLoadMore() {
}
});


联系作者

我的微信公众号:吴小龙同学,欢迎关注交流,公号回复关键字「1024」有惊喜哦。