Android-RecyclerView如何使用多个绑定处理ViewHolder [英] Android - RecyclerView how to handle ViewHolder with multiple bindings

查看:124
本文介绍了Android-RecyclerView如何使用多个绑定处理ViewHolder的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的onBindViewHolder:

Here is my 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:

Here is my 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;
        }

    }

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

I want to be able to get appropriate binding to be able to make changes to the views inside.

推荐答案

当您为recyclerview设计2种布局时,必须为2种不同的viewholder.

When you have 2 different layout for recyclerview than you must have 2 different viewholder for it.

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

First add 2 different viewHolder for your adapter

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

}

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

after that set item type for adapter with this method

@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:

in your onCreateViewHolder use 2 viewHolder like this:

@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方法:

and inside your onBindViewHolder you can call eash viewHolder method:

@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如何使用多个绑定处理ViewHolder的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆