首先上问题
这是一个用 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 < childCount; i++) {
final View child = parent.getChildAt(i);
final int childRealPosition = parent.getChildAdapterPosition(child);
//在最后的一个的时候在画出来。
if (childRealPosition >= 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. 以上