1. 程式人生 > >上拉載入,包裹任意佈局,多層巢狀listview

上拉載入,包裹任意佈局,多層巢狀listview

  上拉載入是在原生控制元件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);
    }
}