我正在尝试从数据库中获取数据以显示在 RecyclerView
中。然而,它似乎不起作用。我的代码确实成功填充了正确数量的行项目,但未检索到数据。
Activity :
public class Chat extends AppCompatActivity {
String username;
public RecyclerView recyclerView;
private DatabaseReference databaseReference;
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chat);
context = this;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Title");
// Set up the input
final EditText input = new EditText(this);
// Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
builder.setView(input);
// Set up the buttons
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
username = input.getText().toString();
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
String key = getIntent().getStringExtra("Key");
Toast.makeText(this, key, Toast.LENGTH_LONG).show();
FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference roomRef = database.getReference("rooms/" + key);
databaseReference = database.getReference("rooms").child(key);
ImageButton sendText = findViewById(R.id.send);
final EditText msg = findViewById(R.id.msg);
sendText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DatabaseReference roomRef2 = roomRef.child(String.valueOf(System.currentTimeMillis()));
Map<String, String> strings = new HashMap<>();
strings.put("user", username);
strings.put("msg", msg.getText().toString());
roomRef2.setValue(strings);
}
});
//RECYCLER VIEW
recyclerView = findViewById(R.id.recycler);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
FirebaseRecyclerAdapter<Msg,MsgViewHolder> adapter = new FirebaseRecyclerAdapter<Msg, MsgViewHolder>(
Msg.class, R.layout.row, MsgViewHolder.class,databaseReference
) {
@Override
protected void populateViewHolder(MsgViewHolder viewHolder, Msg model, int position) {
viewHolder.setUser(model.getUsername());
viewHolder.setMsg(model.getMessage());
Toast.makeText(context, model.getUsername(), Toast.LENGTH_LONG).show();
}
};
recyclerView.setAdapter(adapter);
}
public static class MsgViewHolder extends RecyclerView.ViewHolder {
TextView username, msg_;
public MsgViewHolder(View itemView) {
super(itemView);
username = itemView.findViewById(R.id.userTxt);
msg_ = itemView.findViewById(R.id.msgTxt);
}
public void setUser(String username) {
this.username.setText(username);
}
public void setMsg(String message) {
this.msg_.setText(message);
}
}
}
型号:
public class Msg {
public Msg(){
}
public Msg(String user, String msg) {
this.user = user;
this.msg = msg;
}
private String user, msg;
public String getMessage() {
return msg;
}
public void setMessage(String message) {
this.msg = message;
}
public String getUsername() {
return user;
}
public void setUsername(String username) {
this.user = username;
}
}
再次,显然有些东西正在工作,因为 RecyclerView
填充了正确数量的行项目。但是,没有检索到任何数据。当尝试获取用户名时,toast 返回 null。
非常感谢任何帮助,谢谢。
最佳答案
在模型类中,您更改了 getter 和 setter 默认(生成)名称,Firebase 使用它们来序列化/反序列化对象。所以你的模型应该是:
public class Msg {
public Msg(){
}
public Msg(String user, String msg) {
this.user = user;
this.msg = msg;
}
private String user, msg;
public String getMsg() {
return msg;
}
public void setMsg(String message) {
this.msg = message;
}
public String getUser() {
return user;
}
public void setUser(String username) {
this.user = username;
}
}
通过使用 setUsername
(和其他变体),firebase 将尝试查找名为 username
的属性,但找不到它,与 message< 相同
。这就是为什么你有正确数量的对象(Firebase 能够初始化你的对象,因为你正确地提供了一个空的构造函数),但它们里面没有任何东西(属性为 null),因为 setter 和 getter 没有匹配属性名称。
您的属性是 user
和 msg
,因此 setter 和 getter 应该反射(reflect)这一点:setUser
、getUser
,setMsg
,getMsg
。
关于java - Firebase Recyclerview 不显示数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50214011/