Как получить доступ к элементу в getItemViewType () FirebaseRecycler? - PullRequest
0 голосов
/ 29 июня 2018

Я создаю функциональность чата в приложении. Сообщения, отправленные пользователем, будут справа, а сообщения, полученные пользователем, - в левой части экрана. Все данные чата хранятся в виде pojo. В методе FirebaseRecycler#getItemViewType() я хочу сравнить UID текущего элемента / pojo с mFirebaseUser.getUid() и назначить макет соответственно.

Как получить доступ к элементу в getItemViewType()?

сообщение pojo

public class message {

private String id;
private String text;
private String name;
private String photoUrl;
private String imageUrl;
private String uid;

public message() {
}

public message(String text, String name, String photoUrl, String imageUrl, String uid) {
    this.text = text;
    this.name = name;
    this.photoUrl = photoUrl;
    this.imageUrl = imageUrl;
    this.uid = uid;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public void setText(String text) {
    this.text = text;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getPhotoUrl() {
    return photoUrl;
}

public String getText() {
    return text;
}

public void setPhotoUrl(String photoUrl) {
    this.photoUrl = photoUrl;
}

public String getImageUrl() {
    return imageUrl;
}

public void setImageUrl(String imageUrl) {
    this.imageUrl = imageUrl;
}

public void setUid(String uid) {
    this.uid = uid;
}

public String getUid() {

    return uid;
}
}

Метод FirebaseRecyler.

private void getMessages() {

    final int VIEW_TYPE_MESSAGE_SENT = 1;
    final int VIEW_TYPE_MESSAGE_RECEIVED = 2;

    FirebaseRecyclerOptions<message> options =
            new FirebaseRecyclerOptions.Builder<message>()
                    .setQuery(messagesRef, parser)
                    .build();
    mFirebaseAdapter = new FirebaseRecyclerAdapter<message, RecyclerView.ViewHolder>(options) {

        @Override
        public int getItemViewType(int position) {
            if (mFirebaseUser.getUid() == ?) {
                // If the current user is the sender of the message
                // Based on the UID associated with the message and current UID
                return VIEW_TYPE_MESSAGE_SENT;

                } else {
                // If some other user sent the message
                return VIEW_TYPE_MESSAGE_RECEIVED;
            }
        }

        @Override
        @NonNull
        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {

            if(viewType == VIEW_TYPE_MESSAGE_SENT) {

                LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
                return new SentMessageViewHolder(inflater.inflate(R.layout.sent_item_message, viewGroup, false));

            } else if(viewType == VIEW_TYPE_MESSAGE_RECEIVED) {

                LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
                return new MessageViewHolder(inflater.inflate(R.layout.item_message, viewGroup, false));
            }

            return null;
        }

        @Override
        protected void onBindViewHolder(RecyclerView.ViewHolder viewHolder,
                                        int position,
                                        @NonNull message friendlyMessage) {
            mProgressBar.setVisibility(ProgressBar.INVISIBLE);
            switch (viewHolder.getItemViewType()) {
                case VIEW_TYPE_MESSAGE_RECEIVED:
                    ((MessageViewHolder) viewHolder).bind(friendlyMessage);
                    break;
                case VIEW_TYPE_MESSAGE_SENT:
                    ((SentMessageViewHolder) viewHolder).bind(friendlyMessage);
                    break;
            }

        }
    };

    mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {

            ....
    });
}

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Давай попробуем это,

  if (mFirebaseUser.getUid() == options.get(position). getUid()) 
0 голосов
/ 30 июня 2018

Решение было довольно простым, на что указывали другие ответы. Единственная проблема с двумя другими ответами заключалась в проверке условия в операторе if, который показывал отправленное сообщение справа только до обновления страницы. Решением было использование метода equals () из класса TextUtils.

@Override
        public int getItemViewType(int position) {
            if (TextUtils.equals(mFirebaseUser.getUid(), getItem(position).getUid())) {
                // If the current user is the sender of the message
                return VIEW_TYPE_MESSAGE_SENT;

                } else {
                // If some other user sent the message
                return VIEW_TYPE_MESSAGE_RECEIVED;
            }
        }
0 голосов
/ 29 июня 2018

Вопрос в том, как получить доступ к элементу в пределах getViewItemType(). Для этого используйте метод getItem(position).

    @Override
    public int getItemViewType(int position) {
          if (mFirebaseUser.getUid() == getItem(position).getUid()) {
               // If the current user is the sender of the message
               // Based on the UID associated with the message and current UID
               return VIEW_TYPE_MESSAGE_SENT;

          } else {
               // If some other user sent the message
               return VIEW_TYPE_MESSAGE_RECEIVED;
          }
    }
...