public void DrawHorizontal(Canvas c, RecyclerView parent) { var top = parent.PaddingTop; var bottom = parent.PaddingBottom; RecyclerView.LayoutParams layoutParams = null; View child = null; var childCount = parent.ChildCount; for (int i = 0; i < childCount; i++) { child = parent.GetChildAt(i); layoutParams = child.LayoutParameters.JavaCast <RecyclerView.LayoutParams>(); var left = child.Right + layoutParams.RightMargin; var right = left + divider.IntrinsicHeight; divider.SetBounds(left, top, right, bottom); divider.Draw(c); } if (child != null) { child.Dispose(); } if (layoutParams != null) { layoutParams.Dispose(); } }
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position) { var colorItemViewHolder = (ColorItemViewHolder)holder; var colorName = colors [position]; colorItemViewHolder.ColorItem.SetColor(colorName); var layoutParams = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent); var colorPickerItemMargin = (int)context.Resources.GetDimension(Resource.Dimension.DigitalConfigColorPickerItemMargin); // Add margins to first and last item to make it possible for user to tap on them. if (position == 0) { layoutParams.SetMargins(0, colorPickerItemMargin, 0, 0); } else if (position == colors.Length - 1) { layoutParams.SetMargins(0, 0, 0, colorPickerItemMargin); } else { layoutParams.SetMargins(0, 0, 0, 0); } colorItemViewHolder.ItemView.LayoutParameters = layoutParams; }
// Optional: custom inflating for ViewHolders without BindableViewHolderLayout attribute protected override View GetCustomLayoutForViewHolder(ViewGroup parent, Type viewHolderType) { var textView = new TextView(parent.Context); var lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent); textView.LayoutParameters = lp; return(textView); }
protected override BaseRecyclerViewHolder <ReportsCalendarDayViewModel> CreateViewHolder(ViewGroup parent, LayoutInflater inflater, int viewType) { var calendarDayCellViewHolder = new CalendarDayCellViewHolder(parent.Context); var layoutParams = new RecyclerView.LayoutParams(parent.LayoutParameters); layoutParams.Width = itemWidth; layoutParams.Height = 51.DpToPixels(parent.Context); calendarDayCellViewHolder.ItemView.LayoutParameters = layoutParams; return(calendarDayCellViewHolder); }
// Create new views (invoked by the layout manager) public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { // create a new view LocationPanel v = new LocationPanel(parent.Context); // set the view's size, margins, paddings and layout parameters RecyclerView.LayoutParams layoutParams = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent); int margin = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, 4, parent.Context.Resources.DisplayMetrics); layoutParams.SetMargins(0, margin, 0, margin); // l, t, r, b v.LayoutParameters = layoutParams; return(new ViewHolder(v, OnClick, OnLongClick)); }
public override void OnDrawOver(Canvas cValue, RecyclerView parent, RecyclerView.State state) { int left = parent.PaddingLeft; int right = parent.Width - parent.PaddingRight; int childCount = parent.ChildCount; for (int i = 1; i < childCount; i++) { View child = parent.GetChildAt(i); RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams)child.LayoutParameters; int size = _dividerHeight; int top = child.Top - lp.TopMargin - _dividerHeight; int bottom = top + size; _divider.Bounds = new Rect(left, top, right, bottom); _divider.Draw(cValue); } }
public override void OnDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { int left = parent.PaddingLeft; int right = parent.Width - parent.PaddingRight; int childCount = parent.ChildCount; for (int i = 0; i < childCount; i++) { View child = parent.GetChildAt(i); RecyclerView.LayoutParams parametres = (RecyclerView.LayoutParams)child.LayoutParameters; int top = child.Bottom + parametres.BottomMargin; int bottom = top + divider.IntrinsicHeight; divider.SetBounds(left, top, right, bottom); divider.Draw(c); } }
public void drawVertical(Canvas c, RecyclerView parent) { int left = parent.PaddingLeft; int right = parent.Width - parent.PaddingRight; int childCount = parent.ChildCount; for (int i = 0; i < childCount; i++) { View child = parent.GetChildAt(i); RecyclerView.LayoutParams parameters = (RecyclerView.LayoutParams)child.LayoutParameters; int top = child.Bottom + parameters.BottomMargin; int bottom = top + mDivider.IntrinsicHeight; mDivider.SetBounds(left, top, right, bottom); mDivider.Draw(c); } }
public void drawHorizontal(Canvas c, RecyclerView parent) { int top = parent.PaddingTop; int bottom = parent.Height - parent.PaddingBottom; int childCount = parent.ChildCount; for (int i = 0; i < childCount; i++) { View child = parent.GetChildAt(i); RecyclerView.LayoutParams parameters = (RecyclerView.LayoutParams)child.LayoutParameters; int left = child.Right + parameters.RightMargin; int right = left + mDivider.IntrinsicHeight; mDivider.SetBounds(left, top, right, bottom); mDivider.Draw(c); } }
private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, int heightSpec, int[] measuredDimension) { View view = recycler.GetViewForPosition(position); if (view != null) { RecyclerView.LayoutParams p = (RecyclerView.LayoutParams)view.LayoutParameters; int childWidthSpec = ViewGroup.GetChildMeasureSpec(widthSpec, PaddingLeft + PaddingRight, p.Width); int childHeightSpec = ViewGroup.GetChildMeasureSpec(heightSpec, PaddingTop + PaddingBottom, p.Height); view.Measure(childWidthSpec, childHeightSpec); measuredDimension[0] = view.MeasuredWidth + p.LeftMargin + p.RightMargin; measuredDimension[1] = view.MeasuredHeight + p.BottomMargin + p.TopMargin; recycler.RecycleView(view); } }
private void DrawVertical(Canvas c, RecyclerView parent) { int left = parent.PaddingLeft; int right = parent.Width - parent.PaddingRight; int recyclerViewTop = parent.PaddingTop; int recyclerViewBottom = parent.Height - parent.PaddingBottom; int childCount = parent.ChildCount; for (int i = 0; i < childCount; i++) { View child = parent.GetChildAt(i); RecyclerView.LayoutParams layoutParams = child.LayoutParameters.JavaCast <RecyclerView.LayoutParams>(); int top = Math.Max(recyclerViewTop, child.Bottom + layoutParams.BottomMargin); int bottom = Math.Min(recyclerViewBottom, top + this.divider.IntrinsicHeight); this.divider.SetBounds(left, top, right, bottom); this.divider.Draw(c); } }
public void drawHorizontal(Canvas c, RecyclerView parent) { int childCount = parent.ChildCount; for (int i = 0; i < childCount; i++) { View child = parent.GetChildAt(i); RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams)child .LayoutParameters; int left = child.Left - layoutParams.LeftMargin; int right = child.Right + layoutParams.RightMargin + mDivider.IntrinsicWidth; int top = child.Bottom + layoutParams.BottomMargin; int bottom = top + mDivider.IntrinsicHeight; mDivider.SetBounds(left, top, right, bottom); mDivider.Draw(c); } }
//竖屏时画竖线 public void DrawVertical(Canvas c, RecyclerView parent) { int left = parent.PaddingLeft; int right = parent.Width - parent.PaddingRight; int childCount = parent.ChildCount; for (int i = 0; i < childCount; i++) { if (i + 1 == childCount) //最后一项不用画线 { return; } View childView = parent.GetChildAt(i); RecyclerView v = new RecyclerView(parent.Context); RecyclerView.LayoutParams _params = (RecyclerView.LayoutParams)childView.LayoutParameters; int top = childView.Bottom + _params.BottomMargin; int bottom = top + _divider.IntrinsicHeight; _divider.SetBounds(left, top, right, bottom); _divider.Draw(c); } }
//横屏时画横线 public void DrawHorizontal(Canvas c, RecyclerView parent) { int top = parent.PaddingTop; int bottom = parent.Height - parent.PaddingBottom; int childCount = parent.ChildCount; for (int i = 0; i < childCount; i++) { if (i == childCount) //最后一项不用画线 { return; } View childView = parent.GetChildAt(i); RecyclerView v = new RecyclerView(parent.Context); RecyclerView.LayoutParams _params = (RecyclerView.LayoutParams)childView.LayoutParameters; int left = childView.Right + _params.RightMargin; int right = left + _divider.IntrinsicHeight; _divider.SetBounds(left, top, right, bottom); _divider.Draw(c); } }
/** * 添加或者移除条目 * * @param recycler RecyclerView * @param displayRect 显示区域 * @param i 条目下标 */ private void AddOrRemove(RecyclerView.Recycler recycler, Rect displayRect, int i) { View child = recycler.GetViewForPosition(i); Rect rect = GetItemFrameByPosition(i); if (!Rect.Intersects(displayRect, rect)) { RemoveAndRecycleView(child, recycler); // 回收入暂存区 } else { AddView(child); MeasureChildWithMargins(child, mWidthUsed, mHeightUsed); RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams)child.LayoutParameters;// getLayoutParams(); LayoutDecorated(child, rect.Left - mOffsetX + lp.LeftMargin + PaddingLeft, rect.Top - mOffsetY + lp.TopMargin + PaddingTop, rect.Right - mOffsetX - lp.RightMargin + PaddingLeft, rect.Bottom - mOffsetY - lp.BottomMargin + PaddingTop); } }
public override void OnDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { base.OnDraw(c, parent, state); int dividerLeft = 32; int dividerRight = parent.Width - 32; for (int i = 0; i < parent.ChildCount; i++) { if (i != parent.ChildCount - 1) { View child = parent.GetChildAt(i); RecyclerView.LayoutParams @params = (RecyclerView.LayoutParams)child.LayoutParameters; int dividerTop = child.Bottom + @params.BottomMargin; int dividerBottom = dividerTop + mDivider.IntrinsicHeight; mDivider.SetBounds(dividerLeft, dividerTop, dividerRight, dividerBottom); mDivider.Draw(c); } } }
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position) { var colorItemViewHolder = (ColorItemViewHolder)holder; var colorName = colors [position]; colorItemViewHolder.ColorItem.SetColor (colorName); var layoutParams = new RecyclerView.LayoutParams (ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent); var colorPickerItemMargin = (int)context.Resources.GetDimension (Resource.Dimension.DigitalConfigColorPickerItemMargin); // Add margins to first and last item to make it possible for user to tap on them. if (position == 0) { layoutParams.SetMargins (0, colorPickerItemMargin, 0, 0); } else if (position == colors.Length - 1) { layoutParams.SetMargins (0, 0, 0, colorPickerItemMargin); } else { layoutParams.SetMargins (0, 0, 0, 0); } colorItemViewHolder.ItemView.LayoutParameters = layoutParams; }
public override void OnDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { if (!initiated) { Init(); } if (parent.GetItemAnimator().IsRunning) { View lastViewComingDown = null; View firstViewComingUp = null; // this is fixed int left = 0; int right = parent.Width; // this we need to find out int top = 0; int bottom = 0; // find relevant translating views int childCount = parent.GetLayoutManager().ChildCount; for (int i = 0; i < childCount; i++) { View child = parent.GetLayoutManager().GetChildAt(i); if (child.TranslationY < 0) { // view is coming down lastViewComingDown = child; } else if (child.TranslationY > 0) { // view is coming up if (firstViewComingUp == null) { firstViewComingUp = child; } } } if (lastViewComingDown != null && firstViewComingUp != null) { // views are coming down AND going up to fill the void top = lastViewComingDown.Bottom + (int)lastViewComingDown.TranslationY; bottom = firstViewComingUp.Top + (int)firstViewComingUp.TranslationY; } else if (lastViewComingDown != null) { // views are going down to fill the void top = lastViewComingDown.Bottom + (int)lastViewComingDown.TranslationY; bottom = lastViewComingDown.Bottom; } else if (firstViewComingUp != null) { // views are coming up to fill the void top = firstViewComingUp.Top; bottom = firstViewComingUp.Top + (int)firstViewComingUp.TranslationY; } background.SetBounds(left, top, right, bottom); background.Draw(canvas); } int dividerLeft = parent.PaddingLeft; int dividerRight = parent.Width - parent.PaddingRight; int childCount1 = parent.ChildCount; for (int i = 0; i < childCount1; i++) { View child = parent.GetChildAt(i); RecyclerView.LayoutParams lParams = (RecyclerView.LayoutParams)child.LayoutParameters; int dividerTop = child.Bottom + lParams.BottomMargin; int dividerBottom = dividerTop + divider.IntrinsicHeight; divider.SetBounds(dividerLeft, dividerTop, dividerRight, dividerBottom); divider.Draw(canvas); } base.OnDraw(canvas, parent, state); }
public override void OnDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { RecyclerView.Adapter adapter = parent.GetAdapter(); if (adapter == null) { return; } int itemCount = adapter.ItemCount; if (orientation == VERTICAL) { bool isRtl = ViewCompat.GetLayoutDirection(parent) == ViewCompat.LayoutDirectionRtl; int paddingLeft; int paddingRight; if (isRtl) { paddingLeft = paddingEnd; paddingRight = paddingStart; } else { paddingLeft = paddingStart; paddingRight = paddingEnd; } int left = parent.PaddingLeft + paddingLeft; int right = parent.Width - parent.PaddingRight - paddingRight; int childCount = parent.ChildCount; for (int i = 0; i < childCount; i++) { View child = parent.GetChildAt(i); RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams)child.LayoutParameters; int position = parent.GetChildLayoutPosition(child); bool show; if (showDividerHelper != null) { show = showDividerHelper.ShowDivider(position + 1); } else { show = (position != itemCount - 1) || showLastDivider; } if (show) { int top = child.Bottom + lp.BottomMargin; if (overlap) { top -= thickness; } int bottom = top + thickness; rect.Set(left, top, right, bottom); c.DrawRect(rect, paint); } if (position == 0) { if (showDividerHelper != null) { show = showDividerHelper.ShowDivider(0); } else { show = showFirstDivider; } if (show) { int bottom = child.Top + lp.TopMargin; if (overlap) { bottom += thickness; } int top = bottom - thickness; rect.Set(left, top, right, bottom); c.DrawRect(rect, paint); } } } } else { int top = parent.PaddingTop + paddingStart; int bottom = parent.Height - parent.PaddingBottom - paddingEnd; int childCount = parent.ChildCount; for (int i = 0; i < childCount; i++) { View child = parent.GetChildAt(i); RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams)child.LayoutParameters; int position = parent.GetChildLayoutPosition(child); bool show; if (showDividerHelper != null) { show = showDividerHelper.ShowDivider(position + 1); } else { show = (position != itemCount - 1) || showLastDivider; } if (show) { int left = child.Right + lp.RightMargin; if (overlap) { left -= thickness; } int right = left + thickness; rect.Set(left, top, right, bottom); c.DrawRect(rect, paint); } if (position == 0) { if (showDividerHelper != null) { show = showDividerHelper.ShowDivider(0); } else { show = showFirstDivider; } if (show) { int right = child.Left + lp.LeftMargin; if (overlap) { right += thickness; } int left = right - thickness; rect.Set(left, top, right, bottom); c.DrawRect(rect, paint); } } } } }
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { int orientation = 0; int headerCount = 0, footerCount = 0, dataCount; var adapterObj = parent.GetAdapter(); var adapterType = adapterObj.GetType(); if (adapterType.IsAssignableFrom(typeof(RecyclerArrayAdapter <>))) { headerCount = (int)adapterType.GetMethod("GetHeaderCount").Invoke(adapterObj, null); footerCount = (int)adapterType.GetMethod("GetFooterCount").Invoke(adapterObj, null); dataCount = (int)adapterType.GetMethod("GetCount").Invoke(adapterObj, null); } else { dataCount = parent.GetAdapter().ItemCount; } int dataStartPosition = headerCount; int dataEndPosition = headerCount + dataCount; RecyclerView.LayoutManager layoutManager = parent.GetLayoutManager(); if (layoutManager is StaggeredGridLayoutManager) { orientation = ((StaggeredGridLayoutManager)layoutManager).Orientation; } else if (layoutManager is GridLayoutManager) { orientation = ((GridLayoutManager)layoutManager).Orientation; } else if (layoutManager is LinearLayoutManager) { orientation = ((LinearLayoutManager)layoutManager).Orientation; } int start, end; if (orientation == OrientationHelper.Vertical) { start = parent.PaddingLeft + mPaddingLeft; end = parent.Width - parent.PaddingRight - mPaddingRight; } else { start = parent.PaddingTop + mPaddingLeft; end = parent.Height - parent.PaddingBottom - mPaddingRight; } int childCount = parent.ChildCount; for (int i = 0; i < childCount; i++) { View child = parent.GetChildAt(i); int position = parent.GetChildAdapterPosition(child); if (position >= dataStartPosition && position < dataEndPosition - 1 ||//数据项除了最后一项 (position == dataEndPosition - 1 && mDrawLastItem) || //数据项最后一项 (!(position >= dataStartPosition && position < dataEndPosition) && mDrawHeaderFooter) //header&footer且可绘制 ) { if (orientation == OrientationHelper.Vertical) { RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams)child.LayoutParameters; int top = child.Bottom + layoutParams.BottomMargin; int bottom = top + mHeight; mColorDrawable.SetBounds(start, top, end, bottom); mColorDrawable.Draw(c); } else { RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams)child.LayoutParameters; int left = child.Right + layoutParams.RightMargin; int right = left + mHeight; mColorDrawable.SetBounds(left, start, right, end); mColorDrawable.Draw(c); } } } }
public override void OnDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { if (mDivider == null) { base.OnDrawOver(c, parent, state); return; } // Initialization needed to avoid compiler warning int left = 0, right = 0, top = 0, bottom = 0, size; int orientation = getOrientation(parent); int childCount = parent.ChildCount; if (orientation == LinearLayoutManager.Vertical) { size = mDivider.IntrinsicHeight; left = parent.PaddingLeft; right = parent.Width - parent.PaddingRight; } else { //horizontal size = mDivider.IntrinsicWidth; top = parent.PaddingTop; bottom = parent.Height - parent.PaddingBottom; } for (int i = mShowFirstDivider ? 0 : 1; i < childCount; i++) { View child = parent.GetChildAt(i); RecyclerView.LayoutParams parametrs = (RecyclerView.LayoutParams)child.LayoutParameters; if (orientation == LinearLayoutManager.Vertical) { top = child.Top - parametrs.TopMargin; bottom = top + size; } else { //horizontal left = child.Left - parametrs.LeftMargin; right = left + size; } mDivider.SetBounds(left, top, right, bottom); mDivider.Draw(c); } // show last divider if (mShowLastDivider && childCount > 0) { View child = parent.GetChildAt(childCount - 1); RecyclerView.LayoutParams parametrs = (RecyclerView.LayoutParams)child.LayoutParameters; if (orientation == LinearLayoutManager.Vertical) { top = child.Bottom + parametrs.BottomMargin; bottom = top + size; } else { // horizontal left = child.Right + parametrs.RightMargin; right = left + size; } mDivider.SetBounds(left, top, right, bottom); mDivider.Draw(c); } }