【问题标题】:Android - RecyclerView how to handle ViewHolder with multiple bindingsAndroid - RecyclerView 如何处理具有多个绑定的 ViewHolder
【发布时间】:2021-01-17 16:43:53
【问题描述】:

这是我的 onBindViewHolder:

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

        MessageModel message = values.get(position);
        switch (holder.getItemViewType()) {
            case VIEW_TYPE_VIDEO_SENT:
                ((VideoMessageHolder) holder).sentBinding.setMessageModel(message);
                break;
            case VIEW_TYPE_VIDEO_RECEIVED:
                ((VideoMessageHolder) holder).receivedBinding.setMessageModel(message);
                break;
        }
    }

这是我的 ViewHolder:



    private class VideoMessageHolder extends RecyclerView.ViewHolder {
        private RowRecyclerViewChatVideoMessageSentBinding sentBinding;
        private RowRecyclerViewChatVideoMessageReceivedBinding receivedBinding;

        VideoMessageHolder(RowRecyclerViewChatVideoMessageSentBinding binding) {
            super(binding.getRoot());
            this.sentBinding = binding;
        }

        VideoMessageHolder(RowRecyclerViewChatVideoMessageReceivedBinding binding) {
            super(binding.getRoot());
            this.receivedBinding = binding;
        }

    }

我希望能够获得适当的绑定,以便能够对内部视图进行更改。

【问题讨论】:

  • 你能具体解释一下你需要什么吗?此代码是否构建?应用程序会崩溃吗?说出正在发生的事情与您想要发生的事情等。
  • 因为我为每条视频消息有两个单独的布局(一个是左向的,另一个是在聊天中的右向,没有什么不同),例如,我希望能够对无论 rcvd 视图持有者还是发送的视图持有者,视图的更改都是相同的,所以我不想为每个视图持有者创建单独的视图持有者并重写它们中的代码....

标签: android android-recyclerview android-viewbinding


【解决方案1】:

当你有 2 个不同的 recyclerview 布局时,你必须有 2 个不同的视图。

首先为您的适配器添加 2 个不同的 viewHolder

private static int TYPE_SENT = 1;
private static int TYPE_RECEIVED = 2;

private class VideoSentHolder extends RecyclerView.ViewHolder {
    private RowRecyclerViewChatVideoMessageSentBinding sentBinding;

    VideoSentHolder(RowRecyclerViewChatVideoMessageSentBinding binding) {
        super(binding.getRoot());
        this.sentBinding = binding;
    }
}

private class VideoReceivedHolder extends RecyclerView.ViewHolder {
    private RowRecyclerViewChatVideoMessageReceivedBinding receivedBinding;

    VideoReceivedHolder(RowRecyclerViewChatVideoMessageReceivedBinding binding) {
        super(binding.getRoot());
        this.receivedBinding = binding;
    }

}

之后使用此方法为适配器设置项目类型

@Override
public int getItemViewType(int position) {
    //Here you have to check condition for sent or received type
    if (TextUtils.isEmpty(list.get(position).isSent())) {
        return TYPE_SENT;

    } else {
        return TYPE_RECEIVED;
    }
}

在您的 onCreateViewHolder 中使用 2 个 viewHolder,如下所示:

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == TYPE_SENT) { // for Sent layout
        RowRecyclerViewChatVideoMessageSentBinding sentBinding;//Your sent binding
        return new VideoSentHolder(sentBinding);

    } else { // for received layout
        RowRecyclerViewChatVideoMessageReceivedBinding receivedBinding;//=your received binding
        return new VideoReceivedHolder(receivedBinding);
    }
}

在您的 onBindViewHolder 中,您可以调用 eash viewHolder 方法:

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
    MessageModel message = values.get(position);
    if (getItemViewType(position) == TYPE_SENT) {
        ((VideoSentHolder) viewHolder).sentBinding.setMessageModel(message);
    } else {
        ((VideoReceivedHolder) viewHolder).receivedBinding.setMessageModel(message);
    }
}

【讨论】:

  • 我知道这一点,但我不想在两个单独的容器中重写相同的大量代码负载,一个就足够了,就像您以传统方式处理布局(不使用视图绑定)和它的视图具有相同的 ID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
相关资源
最近更新 更多