first item center aligns in SnapHelper in RecyclerView

前端 未结 2 511
粉色の甜心
粉色の甜心 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 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;
        }
    }
    

提交回复
热议问题