Как использовать FirebaseListAdapter с 2 макетами - PullRequest
0 голосов
/ 06 мая 2018

Итак, я хочу создать приложение для чата с помощью Firebase API , но мне кажется, что я не могу переключаться между макетом для определенных элементов (например, отправленных и полученных сообщений). Я нашел способ, но он не эффективен, и этот метод похож на это: я делаю 1 макет с моделью для отправленных и полученных сообщений, и после этого я скрываю поле «Отправленные», если сообщение получено, и скрываю поле «Получено», если сообщение послал Я использую это для моего адаптера:

mPostAdapterChat = new FirebaseRecyclerAdapter<Chat, ChatViewHolder>(
            Chat.class,
            R.layout.item_layout_chat,
            ChatViewHolder.class,
            mChatRef
    )

Так есть ли у вас, ребята, какие-то методы, как я могу использовать 2 макета и переключаться между ними для каждого элемента (например, отправленное и полученное сообщение), или вы знаете другой способ, как я могу сделать это лучше, чем использовать gone/visibile

1 Ответ

0 голосов
/ 06 мая 2018

Вы действительно можете сделать это:

1) В вашем классе чата определите тип сообщения: отправьте или получите. Добавьте атрибут или создайте метод, например isSent(), чтобы проверить, является ли это отправляющим или получающим сообщением. Я буду использовать метод isSent() в качестве примера.

2) Переопределите метод getItemViewType в адаптере представления переработчика и верните int, представляющий тип (например, 0 для отправки и 1 для получения)

@Override
    public int getItemViewType(int position) {
        Chat chat = this.getItem(position);
        if(chat.isSent()){
           return 0;
         }else{
           return 1;
         }
    }

Чтобы получить элемент в вашем RecyclerViewAdapter переопределенном getItem:

@Override
public Chat getItem(int pos) {
    return super.getItem(getCount() - 1 - pos);
}

3) В вашем методе onCreateViewHolder у вас будет доступ к типу представления, поэтому вы можете просто раздувать другой макет в зависимости от типа представления.

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         switch (viewType) {
             case 0: //inflate and return view holder type 0
             case 1: //inflate and return view holder type 1
         }
    }
...