Я пытаюсь создать инструмент обмена сообщениями чата в Android, после выполнения нескольких руководств код не работает.
Я пытался изменить способ чтения базы данных и ее структуру.
Я следовал этому уроку отсюда https://medium.com/android-grid/how-to-use-firebaserecycleradpater-with-latest-firebase-dependencies-in-android-aff7a33adb8b
public class Chat extends AppCompatActivity {
RecyclerView listOfMessages;
FirebaseRecyclerAdapter adapter;
LinearLayoutManager linearLayoutManager;
FirebaseRecyclerOptions<ChatMessage> options;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EditText input = (EditText)findViewById(R.id.input);
DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Chat").push();
//add messageText, messageTime, messageUser as a hash map to the database
Map<String, Object> map = new HashMap<>();
map.put("Body", input.getText().toString());
map.put("Username", FirebaseAuth.getInstance().getCurrentUser().getEmail());
map.put("Post time", new Date().getTime());
reference.setValue(map);
input.setText("");
}
});
linearLayoutManager = new LinearLayoutManager(this);
listOfMessages.setLayoutManager(linearLayoutManager);
listOfMessages.setHasFixedSize(true);
fetch();
}
private void fetch() {
Log.v("TAG", "in fetch");
Query query = FirebaseDatabase.getInstance().getReference().child("Chats");
Log.v("TAG", query.toString());
//FirebaseRecyclerAdapter binds query to a RecycleView. When data is added, removed or changed these updates are automatically applied to UI in real time.
options = new FirebaseRecyclerOptions.Builder<ChatMessage>()
.setLifecycleOwner(this)
.setQuery(query, new SnapshotParser<ChatMessage>(){
@NonNull
@Override
public ChatMessage parseSnapshot(@NonNull DataSnapshot snapshot) { //Needed to customize how ChatMessage class is parsed
Log.v("TAG", "in parseSnapshot");
return new ChatMessage(snapshot.child("Body").getValue().toString(), snapshot.child("Username").getValue().toString());
}
}).build();
Log.v("TAG", options.toString());
//Uses a ViewHolder to display each item
adapter = new FirebaseRecyclerAdapter<ChatMessage, ViewHolder>(options) {
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
//Create a new instance of ViewHolder, uses R.layout.message for each item
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.message, viewGroup, false);
Log.v("TAG", "in onCreateViewHolder");
return new ViewHolder(view);
}
@Override
protected void onBindViewHolder(ViewHolder holder, final int position, ChatMessage model) {
Log.v("TAG", "in onBindViewHolder");
holder.setMessageText(model.getMessageText());
holder.setMessageUser(model.getMessageUser());
}
};
listOfMessages.setAdapter(adapter);
}
```
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView messageText;
public TextView messageUser;
public TextView messageTime;
public ViewHolder(View itemView){
super(itemView);
messageText = itemView.findViewById(R.id.message_text);
messageUser = itemView.findViewById(R.id.message_user);
messageTime = itemView.findViewById(R.id.message_time);
}
public void setMessageText(String text) {
messageText.setText(text);
}
public void setMessageUser(String user) {
messageUser.setText(user);
}
public void setMessageTime(TextView messageTime) {
this.messageTime = messageTime;
}
}
}
Должны быть вызваны переопределенные методы, а операторы журнала записаны в консоль.Однако они не отображаются, а комментарии не отображаются в представлении «Повторное использование» в XML.