Skip to content Skip to sidebar Skip to footer

Android - Recyclerview How To Handle Viewholder With Multiple Bindings

Here is my onBindViewHolder: @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { MessageModel message = values.get(posi

Solution 1:

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

First add 2 different viewHolder for your adapter

privatestaticintTYPE_SENT=1;
privatestaticintTYPE_RECEIVED=2;

privateclassVideoSentHolderextendsRecyclerView.ViewHolder {
    private RowRecyclerViewChatVideoMessageSentBinding sentBinding;

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

privateclassVideoReceivedHolderextendsRecyclerView.ViewHolder {
    private RowRecyclerViewChatVideoMessageReceivedBinding receivedBinding;

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

}

after that set item type for adapter with this method

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

    } else {
        return TYPE_RECEIVED;
    }
}

in your onCreateViewHolder use 2 viewHolder like this:

@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == TYPE_SENT) { // for Sent layout
        RowRecyclerViewChatVideoMessageSentBinding sentBinding;//Your sent bindingreturnnewVideoSentHolder(sentBinding);

    } else { // for received layout
        RowRecyclerViewChatVideoMessageReceivedBinding receivedBinding;//=your received bindingreturnnewVideoReceivedHolder(receivedBinding);
    }
}

and inside your onBindViewHolder you can call eash viewHolder method:

@OverridepublicvoidonBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
    MessageModelmessage= values.get(position);
    if (getItemViewType(position) == TYPE_SENT) {
        ((VideoSentHolder) viewHolder).sentBinding.setMessageModel(message);
    } else {
        ((VideoReceivedHolder) viewHolder).receivedBinding.setMessageModel(message);
    }
}

Post a Comment for "Android - Recyclerview How To Handle Viewholder With Multiple Bindings"