问题描述
这是我的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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!