首先上问题
 这是一个用 recycleview做得垂直列表,在列表的最底部,是紧贴屏幕的底部,但是我们需要留出一定的控件来处理,这样看来正常点。
 这是一个用 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. 以上




 断点-含光君  回复 @拉大锯
 断点-含光君  回复 @拉大锯 

















