android - 如何选择性地装饰 RecyclerView 项目

标签 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);
    }
}

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

最佳答案

您还需要在 draw 方法上调用 isDecorated,因为此时您没有在这些项目上放置偏移量,但您仍然在上面绘制。

该方法循环遍历当前在屏幕上可见的 RecyclerView 中的所有 subview 。

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);
        }
    }
}

关于android - 如何选择性地装饰 RecyclerView 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28232909/

相关文章:

android - 加载图片时加载资源失败

java - ListView:删除项目之间的空格,并限制 ListView 中的项目数量

android - 如何使用gradle将所有 flavor APK上传到nexus?

android - 在python中发送多个返回值并使用chaquopy在android中获取

android - 具有部分重叠的自定义 View 项目的 ListView (Android)

android - 如何使用约束布局设置recyclerview最小高度wrap_content但最大百分比?

android - 从 AsyncTaskLoader 更新 UI

android - 适用于 Android 的可扩展(月 View )/可折叠(周 View )日历小部件

android - 发生布局更改时设置动画

android - 什么是更新 RecyclerView 中大量移动的项目(交换)和即时用户反馈的良好实现?