java - 在 ListView 中显示 Firebase 数据
问题描述
我无法在 ListView 中显示存储的数据。一切正常,没有错误,但我的数据没有显示。
在我的应用程序中,老师注册并选择他们想要教的科目。数据存储在 Firebase 数据库中。在下一个活动中,他们应该审查他们选择的主题(主题应该显示在 ListView 中)。但是,我似乎无法让它工作。它显示为空白。我不知道我做错了什么。
确认主题活动
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import java.util.ArrayList;
public class ConfirmSubjectsActivity extends AppCompatActivity {
private DatabaseReference mDatabase;
private ListView list_id;
private ArrayList<String> arrayList = new ArrayList<>();
private ArrayAdapter<String> arrayAdapter;
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_confirm_subjects);
mAuth = FirebaseAuth.getInstance();
FirebaseUser user = mAuth.getCurrentUser();
String userId = user.getUid();
arrayAdapter = new ArrayAdapter<String>(ConfirmSubjectsActivity.this, android.R.layout.simple_list_item_1, arrayList);
list_id = findViewById(R.id.list_id);
list_id.setAdapter(arrayAdapter);
mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
for (DataSnapshot subjectssnapshot: snapshot.getChildren()){
String value = subjectssnapshot.child("Predmeti").getValue(String.class);
arrayList.add(value);
}
}
@Override
public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot snapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
“Predmeti”=“主题”仅供参考
解决方案
您可能正确地将数据添加到列表中,但在您通知适配器更改的数据之前,它不会重新绘制 UI。
要通知适配器,请notifyDataSetChanged
在将项目添加到列表后调用它:
mDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
for (DataSnapshot subjectssnapshot: snapshot.getChildren()){
String value = subjectssnapshot.child("Predmeti").getValue(String.class);
arrayList.add(value);
}
arrayAdapter.notifyDataSetChanged();
}
另请参阅notifyDataSetChanged
.
推荐阅读
- python - 表单或模型中的 Django 外键字段验证(仅从外键获取由该用户创建的信息)
- excel - 仅当在用户窗体中单击按钮时才运行“FindNext”
- r - 使用文件路径作为 system() 的参数来执行 C 代码
- javascript - 错误:使用 IBMCloud VisualRecognition NodeJS 未收到响应
- python - 当活动作业数量小于 N 时添加新任务
- java - 如果我的 java home 是空的,maven 从哪里获取 java 版本
- apache-kafka - Spring Kafka 使用 JsonNode 对象
- python - 搜索字典列表并不能给出可靠的结果?
- python - aiortc - 更改视频流大小
- javascript - Javascript无法读取数组的第二个元素