package zone.com.zrefreshlayout.loadmore;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListAdapter;
import android.widget.ListView;
import zone.com.zrefreshlayout.AUtils;
import zone.com.zrefreshlayout.ZRefreshLayout;
import static zone.com.zrefreshlayout.utils.LogUtils.log;
/**
* [2017] by Zone
*/
public class ListViewLoadMoreListener implements LoadMoreOtherListener {
private ZRefreshLayout zRefreshLayout;
private OnScrollListViewListener mOnScrollRecyclerViewListener;
@Override
public void addListener(View view, ZRefreshLayout zRefreshLayout) {
ListView rv = (ListView) view;
this.zRefreshLayout = zRefreshLayout;
rv.setOnScrollListener(mOnScrollRecyclerViewListener = new OnScrollListViewListener());
}
@Override
public void removeListener(View view) {
ListView rv = (ListView) view;
rv.setOnScrollListener(null);
}
@Override
public boolean haveListener() {
return mOnScrollRecyclerViewListener != null;
}
@Override
public boolean instanceOf(View view) {
return view instanceof ListView;
}
@Override
public LoadMoreOtherListener clone_() {
return new ListViewLoadMoreListener();
}
public class OnScrollListViewListener implements AbsListView.OnScrollListener {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE)
if (!isFirstItemVisible(view) && zRefreshLayout.isCanLoadMore()
&& AUtils.isRest(zRefreshLayout) && isLastItemVisible(view)) {
log("ListViewLoadMoreListener---->loadMore");
AUtils.loadMore(zRefreshLayout);// 执行上拉加载数据
}
}
/**
* 判断最后一个条目是否完全可见
*
* @param view
* @return
*/
private boolean isLastItemVisible(AbsListView view) {
ListAdapter adapter = view.getAdapter();
// 如果未设置Adapter或者Adapter没有数据可以上拉刷新
if (null == adapter || adapter.getCount() == 0) {
return true;
}
// 最后一个条目View完全展示,可以刷新
int lastVisiblePosition = view.getLastVisiblePosition();
if (lastVisiblePosition >= adapter.getCount() - 1) {
return view.getChildAt(view.getChildCount() - 1).getBottom()
<= view.getBottom();
}
return false;
}
private boolean isFirstItemVisible(AbsListView view) {
ListAdapter adapter = view.getAdapter();
if (null == adapter || adapter.getCount() == 0)
return true;
if (view.getFirstVisiblePosition() == 0)
return view.getChildAt(0).getTop() >= 0;
return false;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
}
}