首页 > 解决方案 > 在 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”=“主题”仅供参考

我的数据库

标签: javaandroidfirebasefirebase-realtime-database

解决方案


您可能正确地将数据添加到列表中,但在您通知适配器更改的数据之前,它不会重新绘制 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.


推荐阅读