LinearSnapHelper , 滑动停靠效果, 当滑动停止的时候,自动调整item,左对齐,或者靠中对齐

来源:互联网 发布:react.js项目 编辑:程序博客网 时间:2024/05/21 14:54
这个需求来自于朋友公司,要一个可以滑动的,停止后能够调整位置的item 条目,我网上搜集,查找了很久,突然才发现原来

RecyclerView 自己提供了相关的接口
SnapHelper  和他的实现类
LinearSnapHelper, 这个类是可以做到左边对齐,中间对齐,在网上搜集了一个
叫做
StartSnapHelper,贴上代码,以做记录
public class StartSnapHelper extends LinearSnapHelper {    private OrientationHelper mVerticalHelper, mHorizontalHelper;    public StartSnapHelper() {    }    @Override    public void attachToRecyclerView(@Nullable RecyclerView recyclerView)            throws IllegalStateException {        super.attachToRecyclerView(recyclerView);    }    @Override    public int[] calculateDistanceToFinalSnap(@NonNull RecyclerView.LayoutManager layoutManager,                                              @NonNull View targetView) {        int[] out = new int[2];        if (layoutManager.canScrollHorizontally()) {            out[0] = distanceToStart(targetView, getHorizontalHelper(layoutManager));        } else {            out[0] = 0;        }        if (layoutManager.canScrollVertically()) {            out[1] = distanceToStart(targetView, getVerticalHelper(layoutManager));        } else {            out[1] = 0;        }        return out;    }    @Override    public View findSnapView(RecyclerView.LayoutManager layoutManager) {        if (layoutManager instanceof LinearLayoutManager) {            if (layoutManager.canScrollHorizontally()) {                return getStartView(layoutManager, getHorizontalHelper(layoutManager));            } else {                return getStartView(layoutManager, getVerticalHelper(layoutManager));            }        }        return super.findSnapView(layoutManager);    }    private int distanceToStart(View targetView, OrientationHelper helper) {        return helper.getDecoratedStart(targetView) - helper.getStartAfterPadding();    }    private View getStartView(RecyclerView.LayoutManager layoutManager,                              OrientationHelper helper) {        if (layoutManager instanceof LinearLayoutManager) {            int firstChild = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition();            boolean isLastItem = ((LinearLayoutManager) layoutManager)                    .findLastCompletelyVisibleItemPosition()                    == layoutManager.getItemCount() - 1;            if (firstChild == RecyclerView.NO_POSITION || isLastItem) {                return null;            }            View child = layoutManager.findViewByPosition(firstChild);            if (helper.getDecoratedEnd(child) >= helper.getDecoratedMeasurement(child) / 2                    && helper.getDecoratedEnd(child) > 0) {                return child;            } else {                if (((LinearLayoutManager) layoutManager).findLastCompletelyVisibleItemPosition()                        == layoutManager.getItemCount() - 1) {                    return null;                } else {                    return layoutManager.findViewByPosition(firstChild + 1);                }            }        }        return super.findSnapView(layoutManager);    }    private OrientationHelper getVerticalHelper(RecyclerView.LayoutManager layoutManager) {        if (mVerticalHelper == null) {            mVerticalHelper = OrientationHelper.createVerticalHelper(layoutManager);        }        return mVerticalHelper;    }    private OrientationHelper getHorizontalHelper(RecyclerView.LayoutManager layoutManager) {        if (mHorizontalHelper == null) {            mHorizontalHelper = OrientationHelper.createHorizontalHelper(layoutManager);        }        return mHorizontalHelper;    }}
 
调用方法很简单,如下 SnapHelper snapHelperStart = new StartSnapHelper();        snapHelperStart.attachToRecyclerView(mRecyclerView);
瞎哔哔了那么久,现在贴上最最重要的两个参考文献,感谢大神的博客
http://www.cnblogs.com/zhujiabin/p/6117482.html
http://www.th7.cn/Program/Android/201703/1141625.shtml

阅读全文
0 0
原创粉丝点击