first item center aligns in SnapHelper in RecyclerView

前端 未结 2 512
粉色の甜心
粉色の甜心 2021-02-08 14:33

I\'m using PagerSnapHelper in RecyclerView. the first item in RecyclerView in left position in the screen. I need the first item in center aligns.

LinearLayoutMa         


        
相关标签:
2条回答
  • 2021-02-08 14:58

    Here's a simpler version of the accepted answer, that is also more flexible since it doesn't refer to the screen width:

    class BoundsOffsetDecoration : ItemDecoration() {
        override fun getItemOffsets(outRect: Rect,
                                    view: View,
                                    parent: RecyclerView,
                                    state: RecyclerView.State) {
            super.getItemOffsets(outRect, view, parent, state)
    
            val itemPosition = parent.getChildAdapterPosition(view)
    
            // It is crucial to refer to layoutParams.width (view.width is 0 at this time)!
            val itemWidth = view.layoutParams.width
            val offset = (parent.width - itemWidth) / 2
    
            if (itemPosition == 0) {
                outRect.left = offset
            } else if (itemPosition == state.itemCount - 1) {
                outRect.right = offset
            }
        }
    }
    

    I've written a Medium post describing a step-by-step implementation of this kind of carousels using RecyclerView and SnapHelper, if you need more details.

    0 讨论(0)
  • 2021-02-08 15:00

    You can use ItemDecoration, below codes work for the first and last item and also support margin.

    import android.content.Context;
    import android.graphics.Point;
    import android.graphics.Rect;
    import android.support.v7.widget.RecyclerView;
    import android.view.Display;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.WindowManager;
    
    public class OffsetItemDecoration extends RecyclerView.ItemDecoration {
    
        private Context ctx;
    
        public OffsetItemDecoration(Context ctx) {
    
            this.ctx = ctx;
        }
    
        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    
            super.getItemOffsets(outRect, view, parent, state);
            int offset = (int) (getScreenWidth() / (float) (2)) - view.getLayoutParams().width / 2;
            ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
            if (parent.getChildAdapterPosition(view) == 0) {
                ((ViewGroup.MarginLayoutParams) view.getLayoutParams()).leftMargin = 0;
                setupOutRect(outRect, offset, true);
            } else if (parent.getChildAdapterPosition(view) == state.getItemCount() - 1) {
                ((ViewGroup.MarginLayoutParams) view.getLayoutParams()).rightMargin = 0;
                setupOutRect(outRect, offset, false);
            }
        }
    
        private void setupOutRect(Rect rect, int offset, boolean start) {
    
            if (start) {
                rect.left = offset;
            } else {
                rect.right = offset;
            }
        }
    
        private int getScreenWidth() {
    
            WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
            Display display = wm.getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);
            return size.x;
        }
    }
    
    0 讨论(0)
提交回复
热议问题