# #java #android #firebase #firebase-realtime-database
Вопрос:
Я создаю приложение для продажи, и когда вы нажимаете на элемент, вы можете отправить свои адреса в базу данных relatime. У меня нет проблем с отображением всех адресов в представлении переработчика, проблема в том, что когда я пытаюсь отфильтровать адреса для определенных пользователей, я получаю пустой экран, на котором вообще нет данных. Я получаю текущего пользователя и сравниваю его с получателем этого сообщения. Переменная MessageRel представляет относительный макет, в котором отображаются сообщения с адресами. Я пытаюсь отфильтровать данные в onBindViewHolder следующим образом:
@Override public void onBindViewHolder(@NonNull MessageViewHolder holder, int position) { Message m = mMessages.get(position); holder.showMessage.setText(m.getAdress()); FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); if(mMessages.get(position).getReciver().equals(user.toString())){ holder.messageRel.setVisibility(View.VISIBLE); }else { holder.messageRel.setVisibility(View.GONE); } }
И вот как выглядит моя база данных
Я действительно не знаю, что я делаю не так?
public class MessageAdapter extends RecyclerView.Adapterlt;MessageAdapter.MessageViewHoldergt; { private Listlt;Messagegt; mMessages; private Context mContext; MessageAdapter messageAdapter; FirebaseUser fUser; public MessageAdapter(Listlt;Messagegt; mMessages, Context mContext) { this.mMessages = mMessages; this.mContext = mContext; } @NonNull @Override public MessageAdapter.MessageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.chat_item_right, parent, false); return new MessageAdapter.MessageViewHolder(view); } @Override public void onBindViewHolder(@NonNull MessageViewHolder holder, int position) { Message m = mMessages.get(position); holder.showMessage.setText(m.getAdress()); FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); if(mMessages.get(position).getReciver().equals(user.toString())){ holder.messageRel.setVisibility(View.VISIBLE); }else { holder.messageRel.setVisibility(View.GONE); } } @Override public int getItemCount() { return mMessages.size(); } public class MessageViewHolder extends RecyclerView.ViewHolder { public TextView showMessage; public RelativeLayout messageRel; public MessageViewHolder(@NonNull View itemView) { super(itemView); showMessage = itemView.findViewById(R.id.showMessage); messageRel = itemView.findViewById(R.id.messageRel); } } /*@Override public int getItemViewType(int position) { fUser = FirebaseAuth.getInstance().getCurrentUser(); if(mMessages.get(position).getReciver().equals(fUser.getUid())){ return CORRECT_RECIVER; }else { return INCORRECT_RECIVER; } }*/
}
Комментарии:
1. Информации недостаточно, чтобы мы могли помочь. Что
mMessages.get(position).getReciver()
возвращается? В чем заключается ценностьuser.toString()
?2. mMessages.get(позиция).getReciver() возвращает значение reciver в базе данных реального времени, а user.toString должен возвращать то же значение, что и для текущего пользователя, вошедшего в систему. Я могу опубликовать весь адаптер, если это поможет
Ответ №1:
Значения, которые вы храните в свойствах author
и reciver
[sic], являются хэш-кодом соответствующего User
объекта в одном конкретном клиенте Android. Другой клиент, скорее всего, даст пользователю другое значение, поэтому это не лучший способ идентификации пользователей.
Вместо того, чтобы использовать user.toString()
для хранения и фильтрации пользователей, идиоматический подход состоит в том, чтобы использовать для этого их UID. Так что храните user.getUID()
и также фильтруйте это.