Заставить адаптер RecyclerView отображать разные представления для разных пользователей

#java #android #android-recyclerview

#java #Android #android-recyclerview

Вопрос:

Я создал приложение для чата, которое использует Firebase firestore для хранения сообщений чата.

Есть несколько конкретных сообщений, которые я хочу, чтобы получал только один из пользователей.

В настоящее время у меня есть 2 ViewTypes:

  1. Тип представления для полученного сообщения

  2. Тип представления для отправки сообщения

Допустим, есть следующий разговор:

пользователь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.