Итак, я использую Firebase UI для получения данных из базы данных.Это выглядит так: ![Database](https://i.stack.imgur.com/JJmEL.jpg)
Я хочу перебрать «сообщения», чтобы получить каждого ребенка, и показать его как сообщение в моем приложении.Вот как выглядит мой класс UserMessage:
public class UserMessage {
private String mUserLogin;
private String mUserMessage;
private String mUID;
UserMessage(String userLogin, String userMessage, String uid) {
mUserLogin = userLogin;
mUserMessage = userMessage;
mUID = uid;
}
public String getmUserLogin() {
return mUserLogin;
}
public void setmUserLogin(String mUserLogin) {
this.mUserLogin = mUserLogin;
}
public String getmUserMessage() {
return mUserMessage;
}
public String getmUID() {
return mUID;
}
public void setmUID(String mUID) {
this.mUID = mUID;
}
public void setmUserMessage(String mUserMessage) {
this.mUserMessage = mUserMessage;
}
}
И я хочу получить его через FirebaseRecyclerOptions:
FirebaseRecyclerOptions<UserMessage> options =
new FirebaseRecyclerOptions.Builder<UserMessage>()
.setQuery(firebaseDatabaseModel.getQuery(), new SnapshotParser<UserMessage>() {
@NonNull
@Override
public UserMessage parseSnapshot(@NonNull DataSnapshot snapshot) {
Log.d("snapshot length", String.valueOf(snapshot.getChildrenCount()));
return snapshot.getValue(UserMessage.class);
}
})
.build();
А вот как мой firebaseDatabaseModel.Метод getQuery () выглядит следующим образом:
public Query getQuery() {
DatabaseReference messageReference = database.child("messages");
return messageReference.limitToLast(50);
}
И вот как я хочу установить данные в моем FirebaseRecyclerAdapter
class ChatMessagesAdapter extends FirebaseRecyclerAdapter<UserMessage, ChatMessagesAdapter.ChatHolder> {
private UserMessage[] userMessages;
/**
* Initialize a {@link RecyclerView.Adapter} that listens to a Firebase query. See
* {@link FirebaseRecyclerOptions} for configuration options.
*
* @param options
*/
public ChatMessagesAdapter(@NonNull FirebaseRecyclerOptions<UserMessage> options) {
super(options);
userMessages = (UserMessage[]) options.getSnapshots().toArray();
}
@Override
protected void onBindViewHolder(@NonNull ChatHolder holder, int position, @NonNull UserMessage model) {
holder.message.setText(userMessages[position].getmUserMessage());
holder.user.setText(userMessages[position].getmUserLogin());
}
@NonNull
@Override
public ChatHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_message, parent, false);
return new ChatHolder(view);
}
static class ChatHolder extends RecyclerView.ViewHolder {
@BindView(R.id.user_message)
TextView message;
@BindView(R.id.user_login)
TextView user;
private ChatHolder(View itemView) {
super(itemView);
ButterKnife.bind(itemView);
}
}
}
Дело в том, что не имеет значениякак я пытаюсь отправить параметры (сообщения пользователя) через массив в FirebaseRecyclerAdapter, он всегда имеет 0 счет.Возможно, проблема заключается в пользовательском парсере (я должен правильно его составить), но мой отладчик просто пропускает эту часть кода:
public UserMessage parseSnapshot(@NonNull DataSnapshot snapshot) {
Log.d("snapshot length", String.valueOf(snapshot.getChildrenCount()));
return snapshot.getValue(UserMessage.class);
}
Так что я даже не могу проверить, что я делаю здесь неправильно.Я пытался понять это уже несколько часов, и я просто не знаю, как с этим справиться.
// Редактировать 1: Из-за предложений @Alex Malmo я изменил ключи базы данных на: ![enter image description here](https://i.stack.imgur.com/jTNSY.jpg)
и UserMessage.class на:
public class UserMessage {
private String userLogin, userMessage, uid;
public UserMessage() {}
public UserMessage(String userLogin, String userMessage, String uid) {
this.userLogin = userLogin;
this.userMessage = userMessage;
this.uid = uid;
}
public String getUserLogin() { return userLogin; }
public String getUserMessage() { return userMessage; }
public String getUid() { return uid; }
}
Похоже, что эта штука все еще находится в создании FirebaseRecyclerOptions.Я пробовал эти два метода:
FirebaseRecyclerOptions<UserMessage> options = new FirebaseRecyclerOptions.Builder<UserMessage>()
.setQuery(query,
UserMessage.class)
.build();
и
FirebaseRecyclerOptions<UserMessage> options = new FirebaseRecyclerOptions.Builder<UserMessage>()
.setQuery(query,
new SnapshotParser<UserMessage>() {
@NonNull
@Override
public UserMessage parseSnapshot(@NonNull DataSnapshot snapshot) {
return snapshot.getValue(UserMessage.class);
}
})
.build();
В обоих случаях - второй аргумент в методе setQuery (часть синтаксического анализа), кажется, игнорируется (компилятор просто пропускает эту часть- он получает правильный запрос и сразу переходит к .build ()), что, по-видимому, является целой проблемой с пустыми данными в адаптере.