如何有选择地装饰RecyclerView项目

akh*_*khy 36 android android-ui android-recyclerview

我正在ItemDecoration从这个要点创建一个子类:https://gist.github.com/alexfu/0f464fc3742f134ccd1e

如何使它只装饰具有一定条件的物品?例如,仅装饰具有特定位置的项目,ViewHolder的类型等.

我已经使用此代码修改了上面提到的要点(加上对已弃用的Android API的一些更改),但所有项目都会被装饰:

public boolean isDecorated(View view, RecyclerView parent) {
    RecyclerView.ViewHolder holder = parent.getChildViewHolder(view);
    return holder instanceof MenuIconViewHolder || holder instanceof MenuDetailViewHolder;
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    if (isDecorated(view, parent)) {
        if (mOrientation == VERTICAL_LIST) {
            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
        } else {
            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
        }
    } else {
        super.getItemOffsets(outRect, view, parent, state);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码出了什么问题?顺便说一句,将这种代码放在ItemDecoration类中是否可以被认为是最佳实践(关注点分离)?

Ste*_*his 32

你也需要在draw方法上调用isDecorated,因为此刻你没有将偏移量放在这些项目上,但你仍然在它上面绘制.

该方法遍历当前在屏幕上可见的RecyclerView中的所有子视图.

public void drawVertical(Canvas c, RecyclerView parent) {
    final int left = parent.getPaddingLeft();
    final int right = parent.getWidth() - parent.getPaddingRight();

    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        final View child = parent.getChildAt(i);
        if(isDecorated(child, parent))
        {
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                .getLayoutParams();
            final int top = child.getBottom() + params.bottomMargin;
            final int bottom = top + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }
}

public void drawHorizontal(Canvas c, RecyclerView parent) {
    final int top = parent.getPaddingTop();
    final int bottom = parent.getHeight() - parent.getPaddingBottom();

    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        final View child = parent.getChildAt(i);
        if(isDecorated(child, parent))
        {
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                .getLayoutParams();
            final int left = child.getRight() + params.rightMargin;
            final int right = left + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 希望我可以为使用`final`关键字额外加+1 (3认同)