java - 使用 ItemDecorator 在 RecyclerView 中制作分隔符

标签 java android draw android-recyclerview

我正在尝试使用ItemDecorator将一些分隔符添加到 RecyclerView 中。这是执行此操作的代码 fragment 。

//...
public abstract C onInflateViewHolder(Context ctx);

public abstract void onBindViewHolder(C holder, int index);

@Override
public void onDraw(Canvas c, RecyclerView parent) {
    if (mOrientation == VERTICAL_LIST) {
        drawVertical(c, parent);
    } else {
        drawHorizontal(c, parent);
    }
}

public void drawVertical(Canvas c, RecyclerView parent) {
    final int left = parent.getPaddingLeft();
    final int right = parent.getWidth() - parent.getPaddingRight();
    for (int i = 0; i < parent.getChildCount(); i++) {
        C view = onInflateViewHolder(mContext);
        onBindViewHolder(view, i);
        RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
        //parent.addView(view.itemView, i, p);
        view.itemView.draw(c);
    }
}
//...

正如你所看到的,我尝试使用 parent.addView(view.itemView, i, p); , parent.addView(view.itemView, i);最后view.itemView.draw(c); .

这是实现:

mItemDecorator =
                new GenericDecorator<ChatDateSeparatorViewHolder>(getActivity(), GenericDecorator.VERTICAL_LIST) {
                    @Override
                    public ChatDateSeparatorViewHolder onInflateViewHolder(Context ctx) {
                        View v = LayoutInflater.from(ctx).inflate(R.layout.chat_message_separator, null);
                        return new ChatDateSeparatorViewHolder(v);
                    }

                    @Override
                    public void onBindViewHolder(ChatDateSeparatorViewHolder holder, int index) {
                        if (index < mAdapter.getItemCount()-1) {
                            ChatMessage previous = mAdapter.getMessage(index);
                            ChatMessage current = mAdapter.getMessage(index+1);

                            long startTime = previous.getSendDate().getTime();
                            long endTime = current.getSendDate().getTime();
                            long diffTime = endTime - startTime;
                            long diffDays = diffTime / (1000 * 60 * 60 * 24);

                            if (diffDays > 0) {
                                holder.text.setText(Converters.format(current.getSendDate(), getActivity()));
                            } else {
                                holder.root.setVisibility(View.GONE);
                            }
                        } else {
                            holder.root.setVisibility(View.GONE);
                        }

                    }
        };

顺便说一下,C 是 Recycler.ViewHolder ,正如您在实现中所看到的。

一切似乎都很好,但在尝试添加 View 时它崩溃了。我确实得到的异常(exception)是 NullpointerException当我将 addView 与 LayoutParams 广告 at android.support.v7.widget.RecyclerView$LayoutParams.getViewPosition(RecyclerView.java:6957) 一起使用时

我只需要知道如何以编程方式添加 View进入RecyclerView无需使用适配器。

编辑:

我正在尝试在 RecyclerView 中添加分隔符,这个分隔符将是我从 ViewHolder 获得的 View ,一切都完成了,我唯一需要知道的是如何以编程方式将 View (我从 ViewHolder 获得)添加到 RecyclerView

这是应用程序模型的屏幕截图,因此您会有更好的想法:

enter image description here

“Hoy”(今天的西类牙语)这一行是分隔符之一。

最佳答案

您可以使用项目View's 标签来执行此操作

Adapter 的 onBindViewHolder 中,您可以确定这是否是当天的最后一条消息。如果这是当天的最后一条消息,那么您可以调用类似 holder.itemView.setTag("isLastForDay") 的内容。

然后在装饰器中,在循环 RecyclerView 的 子级时,读取每个子级的标签。如果标签包含“isLastForDay”,则执行您的“hoy”绘图逻辑。

关于java - 使用 ItemDecorator 在 RecyclerView 中制作分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26864092/

相关文章:

Java 泛型和静态工厂方法——语法

java - 如何通过Python服务器和Android客户端使用Http推送?

java - 默认开启前置摄像头

升级 Picasso Library 时 Android 崩溃

java - 如何在Android中备份备忘录和任务

java - 处理:尝试在没有绘图功能的情况下对线条的绘制进行动画处理

ios - 如何使用 SKShapeNode 绘制一条线并使其成为物理体(启用碰撞)?

java - 从另一个线程更新 JLabel

android - 大约 1% 的时间找不到 list 定义的接收者

c++ - Bresenham 的中点算法,我如何填补空白?