Android - RecyclerView 如何处理具有多个绑定(bind)的 ViewHolder

标签 android android-recyclerview android-viewbinding

这是我的 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;
        }

    }
我希望能够获得适当的绑定(bind),以便能够对内部的 View 进行更改。

最佳答案

当你有 2 个不同的 recyclerview 布局时,你必须有 2 个不同的 View 。
首先为您的适配器添加 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);
    }
}

关于Android - RecyclerView 如何处理具有多个绑定(bind)的 ViewHolder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64164201/

相关文章:

android - Android Nougat 升级中的 Recyclerview 问题

android - 如何在我的布局中膨胀 textview xml?

android - 无法格式化操作栏标题

android - 无尽的滚动 kotlin 回收 View /ListView

android-gradle-plugin - 使用 AGP 4.2.0 或 7.0 时未为 androidTests 生成 R 文件

android - 为什么使用 View Binding 会改变布局?

android - 如何在 Android 中使用 View 绑定(bind)

android - DrawerLayout 必须使用 MeasureSpec.EXACTLY 进行测量

android - USB/RS232通信安全异常android.permission.sec.MDM_APP_MGMT

android - 将项目保存为 "Favorite"并在其他回收站 View 中显示