Android - RecyclerView como lidar com ViewHolder com várias ligações
Oct 01 2020
Aqui está meu 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;
}
}
Aqui está meu 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;
}
}
Desejo obter a vinculação apropriada para fazer alterações nas visualizações internas.
Respostas
KeyurNimavat Oct 02 2020 at 02:07
Quando você tem 2 layouts diferentes para a visualização de reciclagem, você deve ter 2 visualizadores diferentes para ele.
Primeiro adicione 2 viewHolder diferentes para o seu adaptador
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;
}
}
depois disso, defina o tipo de item para o adaptador com este método
@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;
}
}
em seu onCreateViewHolderuso 2 viewHolder como este:
@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);
}
}
e dentro de seu onBindViewHolder você pode chamar o método 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);
}
}
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
Christopher Nolan uma vez se arrependeu de ter lido o 'roteiro de Pulp Fiction' de Quentin Tarantino