Android-recycleview-分割线彩蛋

0次阅读

共计 2195 个字符,预计需要花费 6 分钟才能阅读完成。

我收集了一些学习用的材料,其中蕴含了很多学习,面试,中高进阶 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 或小程序关上。

正文完
 0