android官方的SwipeRefreshlayout控件不支持上拉加載,于是修改了MultiStateView的部分代碼,做為listView的footview,封裝成了這個(gè)可以加載更多的控件,且footview的狀態(tài)可以改變。
地址:https://github.com/fantianwen/MultiStateRefreshLayout
- 支持ListView
- 支持footView改變狀態(tài)
使用方法
<van.tian.wen.multirefreshlayout.MultiStateRefreshLayout
android:id="@+id/multiRefreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
van:emptyView="@layout/emptylayout"
van:errorView="@layout/errorlayout"
van:listView="@layout/lv"
van:loadingView="@layout/loadinglayout"
van:successView="@layout/successlayout"
van:unknownView="@layout/unknownlayout">
</van.tian.wen.multirefreshlayout.MultiStateRefreshLayout>
代碼中:
multiRefreshLayout = (MultiStateRefreshLayout) findViewById(R.id.multiRefreshLayout);
multiRefreshLayout.setColorSchemeColors(Color.GREEN);
mListView = multiRefreshLayout.getListView();
multiRefreshLayout.setListView(mListView);
myAdapter = new MyAdapter(this, mLists);
mListView.setAdapter(myAdapter);
multiRefreshLayout.setOnLoadingListener(new MultiStateRefreshLayout.OnLoadingListener() {
@Override
public void onLoadMore() {
// 加載更多
}
});
multiRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
// 刷新
}
});
multiRefreshLayout.setOnSucessFootClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 點(diǎn)擊footView的加載加載更多
}
});
實(shí)現(xiàn)原理
關(guān)鍵代碼:
public void setListView(final ListView mListView) {
this.mListView = mListView;
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case SCROLL_STATE_FLING:
break;
case SCROLL_STATE_IDLE:
//監(jiān)聽(tīng)是都能夠上拉刷新
if (canRefresh()) {
setEnabled(true);
} else {
setEnabled(false);
}
//監(jiān)聽(tīng)能夠上拉加載更多
if (canLoadMore(scrollState)) {
loadData();
}
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});
}
其實(shí)主要解決的問(wèn)題就是SwipeRefreshLayout的下拉操作會(huì)和ListView的下拉操作相沖突,我們只要在ListView的scrollListener中進(jìn)行判斷:
case SCROLL_STATE_IDLE:
//監(jiān)聽(tīng)是都能夠上拉刷新
if (canRefresh()) {
setEnabled(true);
} else {
setEnabled(false);
}
//監(jiān)聽(tīng)能夠上拉加載更多
if (canLoadMore(scrollState)) {
loadData();
}
break;
其中canRefresh()代碼如下:
private boolean canRefresh() {
return isTop();
}
private boolean isTop() {
if (mListView.getCount() > 0) {
if (mListView.getFirstVisiblePosition() == 0
&& mListView.getChildAt(0).getTop() >= mListView.getTop()) {
return true;
}
}
return false;
}
不足
改變狀態(tài)需要自主代碼調(diào)用實(shí)現(xiàn),因?yàn)?code>SwipeRefreshLayout不能夠判斷已經(jīng)刷新完畢,這點(diǎn)比較不人性化。