Android recycleview 分割线彩蛋

我收集了一些学习用的资料,其中包含了很多学习,面试,中高进阶fluuter资料,还有很多视频详解,如果有同学想进一步了解,详情请看文末。也欢迎各路大神门前来装X。

首先上问题

怎么做?

当我们空余时间的时候,需要有~~外遇~~

实现

首先上问题

这是一个用 recycleview做的垂直列表,在列表的最底部,是紧贴屏幕的底部,但是我们需要留出一定的空间来处理,这样看来正常点。

怎么做?

比如在最后一种item的底部预留了一个高度50dp的view,adapter在bind数据的时候,根据position判断是否需要显示这个透明的50dp的view。这个操作是可以的,我以前也是这样做过。好像不太优雅,(管他呢,先把效果做出来了再说)

当我们空余时间的时候,需要有~~外遇~~

今天无意中在想,这样的一个底部view,也是属于一个item吧,可以这样理解。又想起了康师傅的ItemDecoration教程,具体视频地址找不到了(请原谅我),也就是我们可以在最后一个item的最后,画一条分割线,但是它是透明的分割线,这样就可以把底部的内容,顶上来了。1)如果你想用margin,padding来处理这个效果,是不美观的,底部会空出一块区域,不显示内容的。2)好像也想不出其他办法了。

实现

我们可以理解前面所有的分割线,都不画出来,就画最后一条

@Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { //我的的drawable对象 if (mDivider == null) { //这个偏移量是0 outRect.set(0, 0, 0, 0); return; } if (mOrientation == VERTICAL) { //处理垂直方向,获取最后一个item的position int lastPosition = state.getItemCount() - 1; //当前item的position int position = parent.getChildAdapterPosition(view); //当他大于等于最后一个的时候,其实不会出现大于的情况的 if (position >= lastPosition) { //把偏移量设置成我们drawable的高度 outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { //除了最后一个分割线有高度,其他分割线高度都是0 outRect.set(0, 0, 0, 0); } } else { //可以不考虑水平方向,同理的 } }

上面是偏移最后一个,到我们再看看draw方法

@Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { if (parent.getLayoutManager() == null || mDivider == null) { return; } if (mOrientation == VERTICAL) { drawVertical(c, parent, state); } else { //我们不需要水平方向的,可以不写这个,当然也可以写 } }

private void drawVertical(Canvas canvas, RecyclerView parent, RecyclerView.State state) { canvas.save(); final int left; final int right; if (parent.getClipToPadding()) { left = parent.getPaddingLeft(); right = parent.getWidth() - parent.getPaddingRight(); canvas.clipRect(left, parent.getPaddingTop(), right, parent.getHeight() - parent.getPaddingBottom()); } else { left = 0; right = parent.getWidth(); }

final int childCount = parent.getChildCount(); final int lastPosition = state.getItemCount() - 1; for (int i = 0; i= lastPosition) { parent.getDecoratedBoundsWithMargins(child, mBounds); final int bottom = mBounds.bottom + Math.round(child.getTranslationY()); final int top = bottom - mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(canvas); } } canvas.restore(); }

drawable设置及喜欢的颜色,我这里需要透明,那就是#00000000. 以上

https://shimo.im/docs/dYkqrQcyr98jPKYX/ 《android学习面试fulutter进阶资料免费获取》,可复制链接后用石墨文档 App 或小程序打开。