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;
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);
}
if (visibleItemCount == totalItemCount) {
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();
}
`
|