安卓弹性view2

来源:互联网 发布:淘宝直通车官网申请 编辑:程序博客网 时间:2024/06/06 01:07

说明:上一篇只是理论性质的文章,在实用方面存在很大的局限性

这篇解决问题有:

                             1.item显示不全问题

                             2.对外暴露刷新和加载更多


刷新容器:

public class PullToRefresh extends FrameLayout {    // 滚动时间    private static final long ANIM_TIME = 400;    //原始位置    private int startL, startR, startT, startB;    //恢复位置阶段    private boolean isMoved = false;    //阻尼    private static final float zuni = 0.8f;    //View    private View view;    private float oldY;    private boolean isRefresh=false;    private boolean isLoadMore=false;    private boolean isOK=true;    private OnRefreshListener onRefreshListener;    public PullToRefresh(Context context) {        super(context);    }    public PullToRefresh(Context context, AttributeSet attrs) {        super(context, attrs);    }    public PullToRefresh(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        //关闭右侧滚动条        this.setVerticalScrollBarEnabled(false);    }    public void setOnRefreshListener(OnRefreshListener onRefreshListener){        this.onRefreshListener=onRefreshListener;    }    @Override    protected void onLayout(boolean changed, int l, int t, int r, int b) {        super.onLayout(changed, l, t, r, b);        if (getChildCount() == 1) {            view = getChildAt(0);            startL = view.getLeft();            startR = view.getRight();            startT = view.getTop();            startB = view.getBottom();        } else if (getChildCount() > 1) {            throw new RuntimeException("只能有一个子View");        } else if (getChildCount() < 1) {            throw new RuntimeException("没有子View");        }    }    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        if (view == null) {            return super.dispatchTouchEvent(ev);        }        boolean isTouchOutOfScrollView = ev.getY() >= startB || ev.getY() <= startT; //如果当前view的Y上的位置        if (isTouchOutOfScrollView) {//如果不在view的范围内            if (isMoved) {//当前容器已经被移动                recoverContainer();            }            return true;        }        switch (ev.getAction()) {            case MotionEvent.ACTION_DOWN:                //记录按下时的Y                oldY = ev.getY();            case MotionEvent.ACTION_MOVE:                float newY = ev.getY();                int scrollY = (int) (newY - oldY);                if (downLicense() && scrollY > 0){                    isRefresh=true;                }else{                    isRefresh=false;                }                if (upLicense()&& scrollY < 0){                    isLoadMore=true;                }else{                    isLoadMore=false;                }                if (isRefresh ||isLoadMore) {                    int offset = (int) (scrollY * zuni);                    view.layout(startL, startT + offset, startR, startB + offset);                    isMoved = true;                    return true;                } else {                    oldY = newY;                    isMoved = false;                    recoverContainer();                    return super.dispatchTouchEvent(ev);                }            case MotionEvent.ACTION_UP:                if (isMoved) {                    recoverContainer();                    return true;                }        }        return super.dispatchTouchEvent(ev);    }    /**     * 位置还原     */    private void recoverContainer() {        if (!isMoved) {            return;        }        if(isOK){            isOK=false;            if(isRefresh&&(!isLoadMore)){                onRefreshListener.refresh();            }else if(isLoadMore&&(!isRefresh)){                onRefreshListener.loadmore();            }        }        TranslateAnimation anims = new TranslateAnimation(0, 0, view.getTop(), startT);        anims.setDuration(ANIM_TIME);        view.startAnimation(anims);        view.layout(startL, startT, startR, startB);        isMoved = false;    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        return false;    }    public boolean downLicense() {        if (view instanceof RecyclerView) {            RecyclerView rv = (RecyclerView) view;            RecyclerView.Adapter adapter = rv.getAdapter();            int firstVisibleItemCount = ((LinearLayoutManager) (rv.getLayoutManager())).findFirstVisibleItemPosition();            if (firstVisibleItemCount == 0 && adapter.getItemCount() > 0&& rv.getChildAt(0).getY() == 0) {                return true;            } else {                return false;            }        }        return true;    }    public boolean upLicense() {        if (view instanceof RecyclerView) {            RecyclerView rv = (RecyclerView) view;            LinearLayoutManager manager = (LinearLayoutManager) rv.getLayoutManager();            //获取最后一个完全显示的ItemPosition            int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();            int totalItemCount = manager.getItemCount();            if (lastVisibleItem == (totalItemCount - 1)){                return true;            } else {                return false;            }        }        return true;    }    public void refreshComplete(){        isOK=true;    }}
使用方法:
1.xml中
<com.shiying.mutualwin.customer.PullToRefresh    android:id="@+id/pulltorefresh"    android:layout_width="match_parent"    android:layout_height="match_parent">    <android.support.v7.widget.RecyclerView        android:id="@+id/rv_goods"        android:layout_width="match_parent"        android:layout_height="match_parent">    </android.support.v7.widget.RecyclerView></com.shiying.mutualwin.customer.PullToRefresh>
2.activity中
pulltorefresh.setOnRefreshListener(new OnRefreshListener() {    @Override    public void refresh() {        page=1;        getGoodsList(0,1);    }    @Override    public void loadmore() {        page++;        getGoodsList(1,2);    }});
public interface OnRefreshListener {    public void refresh();    public void loadmore();}




原创粉丝点击