android横向滑动选中居中实现

需求:订单列表横向滑动,停靠中间默认选中。

效果:
image.png

布局:
image.png

代码实现:

        // 订单列表
        mOrderRecycleView = findViewById(R.id.rv_quality_group_order_list);
        mOrderAdapter = new OrderSimpleAdapter(this);
        mOrderRecycleView.setAdapter(mOrderAdapter);
        // 让recycleview的item居中的方法
        LinearSnapHelper mLinearySnapHelper = new LinearSnapHelper();
        mLinearySnapHelper.attachToRecyclerView(mOrderRecycleView);
        // 处理第一个和最后一个居中问题
        mOrderRecycleView.addItemDecoration(new RecyclerItemCenterDecoration());
        // ---布局管理器---
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        // 默认是Vertical (HORIZONTAL则为横向列表)
        linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        mOrderRecycleView.setLayoutManager(linearLayoutManager);
        // 左右滑动监听
        mOrderRecycleView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    View viewIdle = mLinearySnapHelper.findSnapView(linearLayoutManager);
                    if (viewIdle != null) {
                        int position = linearLayoutManager.getPosition(viewIdle);
                        if (position != mOrderIndex) {
                            mOrderAdapter.getItem(position).setSelected(true);
                            mOrderAdapter.getItem(mOrderIndex).setSelected(false);
                            mOrderIndex = position;
                            mOrderAdapter.notifyDataSetChanged();
                        }
                    }
                }
            }
        });

重写Decoration:

public class RecyclerItemCenterDecoration extends RecyclerView.ItemDecoration {
    /**
     * 自定义默认的Item的边距
     */
    private int mPageMargin = 15;//dp
    /**
     * 第一个item的左边距
     */
    private int mLeftPageVisibleWidth;

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {

        // 计算一下第一个item距离屏幕左边的距离:(屏幕的宽度-item的宽度)/2。其中item的宽度=实际ImagView的宽度+margin。
        view.measure(0,0);
        // 默认值
        int childViewWidth = dpToPx(120);
        if(view.getMeasuredWidth() > 0){
            childViewWidth = view.getMeasuredWidth();
        }
        //获取实际居左距离
        mLeftPageVisibleWidth = (getScreenWidth(view.getContext()) / 2 - childViewWidth / 2);
        //获取当前Item的position
        int position = parent.getChildAdapterPosition(view);
        //获得Item的数量
        int itemCount = parent.getAdapter().getItemCount();
        int leftMagin = 0;
        int rightMagin = 0;
        if(position == 0 && itemCount == 1){

        }else if(position == 0){
            if(mLeftPageVisibleWidth < dpToPx(mPageMargin)){
                leftMagin = mLeftPageVisibleWidth;
                rightMagin = mLeftPageVisibleWidth;
            }else{
                leftMagin = mLeftPageVisibleWidth;
                rightMagin = dpToPx(mPageMargin);
                //leftMagin = 0;
            }
        }else if(position == itemCount-1){
            if(mLeftPageVisibleWidth < dpToPx(mPageMargin)){
                rightMagin = mLeftPageVisibleWidth;
                leftMagin = mLeftPageVisibleWidth;
            }else{
                rightMagin = mLeftPageVisibleWidth;
                leftMagin = dpToPx(mPageMargin);
            }
        }else{
            leftMagin = dpToPx(mPageMargin);
            rightMagin = dpToPx(mPageMargin);
        }

        RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) view.getLayoutParams();

        //10,10分别是item到上下的margin
        layoutParams.setMargins(leftMagin,10,rightMagin,10);
        view.setLayoutParams(layoutParams);
        super.getItemOffsets(outRect, view, parent, state);
    }

    /**
     * d p转换成px
     * @param dp:
     */
    private int dpToPx(int dp){
        return (int) (dp * Resources.getSystem().getDisplayMetrics().density + 0.5f);

    }

    /**
     * 获取屏幕的宽度
     * @param context:
     * @return :
     */
    public static int getScreenWidth(Context context) {
        WindowManager manager = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
        Display display = manager.getDefaultDisplay();
        int screenWidth = display.getWidth();
        return screenWidth;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容