上拉載入,包裹任意佈局,多層巢狀listview
阿新 • • 發佈:2018-11-16
上拉載入是在原生控制元件swipeRefreshlayout的基礎上增加的功能,實現方式網上copy就行。主要是refreshLayout包裹多層佈局,多個listview的時候,操作的是那個listview。程式碼可以看出所有上拉載入的操作均在佈局繪製完成,且資料載入完畢以後,能夠對介面介面進行操作的時候,所以直接指定某個listview是可以的。
public class RefreshLayout extends SwipeRefreshLayout implements AbsListView.OnScrollListener { private RefreshLayout.OnViewRefreshListener mListener; private RefreshLayout.OnListViewScrollListener mOnListViewScrollListener; private RefreshLayout.OnListViewScrollStateChanged mOnListViewScrollStateChanged; private int mTouchSlop; private float startY; private float startX; private boolean mIsChildDragging; private LJRefreshListView mLJRefreshListView; private View mFootContainerView; private View mFootLoadEnd; private TextView mFootLoadEndText; private int mYDown; private int mLastY; private boolean mIsLoading; private boolean mHasMore; public RefreshLayout(Context context) { this(context, (AttributeSet)null); } public RefreshLayout(Context context, AttributeSet attrs) { super(context, attrs); this.mIsLoading = false; this.mHasMore = false; this.mFootContainerView = (LinearLayout) LayoutInflater.from(context).inflate(layout.baseview_view_refresh_bottom, (ViewGroup)null); this.mFootLoadEnd = (LinearLayout)LayoutInflater.from(context).inflate(layout.baseview_view_refresh_bottom_end, (ViewGroup)null); this.mFootLoadEndText = (TextView)this.mFootLoadEnd.findViewById(id.view_load_end_text); this.mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); } public void setLJRefreshListView(LJRefreshListView LJRefreshListView) { mLJRefreshListView = LJRefreshListView; } public void setRefreshingNoLoading() { this.setProgressViewOffset(false, 0, (int)(-60.0F * this.getResources().getDisplayMetrics().density)); this.setRefreshing(true); this.post(new Runnable() { public void run() { RefreshLayout.this.setProgressViewOffset(false, (int)(-60.0F * RefreshLayout.this.getResources().getDisplayMetrics().density), (int)(64.0F * RefreshLayout.this.getResources().getDisplayMetrics().density)); } }); } public void setRefreshing(boolean refresh) { super.setRefreshing(refresh); if (refresh) { this.mIsLoading = true; if (this.mListener != null) { this.mListener.onRefresh(false); } } else { this.mIsLoading = false; } } public void setOnRefreshListener(RefreshLayout.OnViewRefreshListener listener) { this.mListener = listener; this.setOnRefreshListener(new OnRefreshListener() { public void onRefresh() { if (RefreshLayout.this.mListener != null) { RefreshLayout.this.mListener.onRefresh(false); } } }); } public void setOnListViewScrollListener(RefreshLayout.OnListViewScrollListener listener) { this.mOnListViewScrollListener = listener; } public void setOnListViewScrollStateChanged(RefreshLayout.OnListViewScrollStateChanged listener) { this.mOnListViewScrollStateChanged = listener; } /** @deprecated */ @Deprecated public void setOnRefreshListener(OnRefreshListener listener) { super.setOnRefreshListener(listener); } public void setLoadingMoreEnabled(boolean enable) { if (this.mLJRefreshListView != null) { this.mHasMore = enable; this.mLJRefreshListView.removeFooterView(this.mFootContainerView); this.mLJRefreshListView.removeFooterView(this.mFootLoadEnd); } } public void setLoadingMoreEnabled(boolean enable, String loadFinishMsg) { if (this.mLJRefreshListView != null) { this.mHasMore = enable; this.mLJRefreshListView.removeFooterView(this.mFootContainerView); this.mLJRefreshListView.removeFooterView(this.mFootLoadEnd); if (!this.mHasMore && !TextUtils.isEmpty(loadFinishMsg)) { this.mLJRefreshListView.addFooterView(this.mFootLoadEnd); this.mFootLoadEndText.setText(loadFinishMsg); } } } public boolean dispatchTouchEvent(MotionEvent event) { int action = event.getAction(); switch(action) { case 0: this.mYDown = (int)event.getRawY(); break; case 1: if (this.canLoadMore()) { this.loadMore(); } break; case 2: this.mLastY = (int)event.getRawY(); } return super.dispatchTouchEvent(event); } private boolean canLoadMore() { return this.isBottom() && !this.mIsLoading && this.isPullUp() && this.mHasMore; } private boolean isBottom() { if (this.mLJRefreshListView != null && this.mLJRefreshListView.getAdapter() != null) { return this.mLJRefreshListView.getLastVisiblePosition() == this.mLJRefreshListView.getAdapter().getCount() - 1; } else { return false; } } private boolean isPullUp() { return this.mYDown - this.mLastY >= this.mTouchSlop; } private void loadMore() { if (this.mListener != null) { this.setLoading(true); this.mListener.onRefresh(true); } } private void setLoading(boolean loading) { this.mIsLoading = loading; if (this.mIsLoading) { this.mLJRefreshListView.removeFooterView(this.mFootContainerView); this.mLJRefreshListView.addFooterView(this.mFootContainerView); } else { this.mYDown = 0; this.mLastY = 0; } } public void onScrollStateChanged(AbsListView view, int scrollState) { if (this.mOnListViewScrollStateChanged != null) { this.mOnListViewScrollStateChanged.onScrollStateChanged(view, scrollState); } } public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (this.mOnListViewScrollListener != null) { this.mOnListViewScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } if (this.canLoadMore()) { this.loadMore(); } } public void setVisibility(int visibility) { if (this.mLJRefreshListView != null) { this.mLJRefreshListView.setVisibility(visibility); } super.setVisibility(visibility); } public boolean onInterceptTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch(action) { case 0: this.startY = ev.getY(); this.startX = ev.getX(); this.mIsChildDragging = false; break; case 1: case 3: this.mIsChildDragging = false; break; case 2: if (this.mIsChildDragging) { return false; } float endY = ev.getY(); float endX = ev.getX(); float distanceX = Math.abs(endX - this.startX); float distanceY = Math.abs(endY - this.startY); if (distanceX > (float)this.mTouchSlop && distanceX > distanceY) { this.mIsChildDragging = true; return false; } } return super.onInterceptTouchEvent(ev); } public interface OnListViewScrollStateChanged { void onScrollStateChanged(AbsListView var1, int var2); } public interface OnListViewScrollListener { void onScroll(AbsListView var1, int var2, int var3, int var4); } public interface OnViewRefreshListener { void onRefresh(boolean var1); } }