我正在尝试在Android中创建聊天消息传递工具,在遵循了一些教程之后,代码无法正常工作。
我尝试更改数据库的读取方式,布局方式。
开始关注本教程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的“回收视图”中。
答案 0 :(得分:0)
您需要使用startListening()
方法来显示数据。
从文档中
FirebaseRecyclerAdapter
使用事件侦听器监视Firebase查询的更改。要开始侦听数据,请调用startListening()
方法。您可能想在onStart()
方法中调用它。在调用startListening()
之前,请确保已完成读取数据所需的所有身份验证,否则查询将失败。
@Override
protected void onStart() {
super.onStart();
adapter.startListening();
}
类似地,
stopListening()
调用将删除事件侦听器和适配器中的所有数据。当包含的Activity或Fragment停止时调用此方法:
@Override
protected void onStop() {
super.onStop();
adapter.stopListening();
}
参考:
https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md