#java #android #android-recyclerview
#java #Android #android-recyclerview
Вопрос:
Я создал приложение для чата, которое использует Firebase
firestore
для хранения сообщений чата.
Есть несколько конкретных сообщений, которые я хочу, чтобы получал только один из пользователей.
В настоящее время у меня есть 2 ViewTypes:
-
Тип представления для полученного сообщения
-
Тип представления для отправки сообщения
Допустим, есть следующий разговор:
пользователь1 пользователю 2: Привет
пользователь2 пользователю 1: Привет
от пользователя 1 к пользователю 2: CLICKS ON A BUTTON AND AN AUTOMATIC MESSAGE IS SENT <----want it to show only to user2.
Что произойдет сейчас в моем адаптере, так это то, что он покажет обоим пользователям это сообщение.
Как я могу убедиться, что только user2 получит его?
Мой адаптер:
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view;
if (viewType == AppConstants.CHAT_SENT_KEY) {
view = LayoutInflater.from( parent.getContext() ).inflate(
R.layout.item_chat_sent,
parent,
false );
return new ChatViewHolder( view );
} else if (viewType == AppConstants.CHAT_RECEIVED_KEY) {
view = LayoutInflater.from( parent.getContext() ).inflate(
R.layout.item_chat_received,
parent,
false );
return new ChatViewHolder( view );
} else {
view = LayoutInflater.from( parent.getContext() ).inflate( R.layout.item_loading, parent, false );
return new LoadingViewHolder( view );
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
if (viewHolder instanceof ChatViewHolder) {
((ChatViewHolder) viewHolder).bind( (chats.get( position )) );
} else if (viewHolder instanceof LoadingViewHolder) {
showLoadingView( (LoadingViewHolder) viewHolder, position );
}
}
@Override
public int getItemViewType(int position) {
if (chats.get( position ).getSenderId().contentEquals( userId )) {
if (position == 0 amp;amp; chats.size() > 49 amp;amp; snapSize > 49) {
return AppConstants.CHAT_LOADING_KEY;
} else {
return AppConstants.CHAT_SENT_KEY;
}
} else {
if (position == 0 amp;amp; chats.size() > 49 amp;amp; snapSize > 49) {
return AppConstants.CHAT_LOADING_KEY;
} else {
return AppConstants.CHAT_RECEIVED_KEY;
}
}
}
Связано ли это с чем-то viewTypes
или я должен использовать условия if в моей части привязки, чтобы он отображался ему, только если идентификатор пользователя равен user2?
Спасибо
Комментарии:
1. Вы не должны что-то делать в адаптере. Вы передаете список адаптеру для показа, верно, вы можете отфильтровать этот список перед передачей его адаптеру для показа в режиме recycler view. Я имею в виду, что каждая строка, отображаемая в представлении recycler, должна соответствовать элементу в списке данных. Таким образом, список данных для user1 не должен содержать определенный элемент.
Ответ №1:
Связано ли это с чем-то
viewTypes
или я должен использовать условия if в моей части привязки, чтобы он отображался ему, только если идентификатор пользователя равен user2?
viewTypes
используется для отображения другого макета, обычно макета, который полностью отличается от другого макета.
Итак, в вашем случае вам больше подходит изменить логику в bind
части, чтобы она отображалась только для user2.