即使数据库中存在数据出口,dataSnapShot.getValue()也会返回null

时间:2020-03-12 14:12:54

标签: android firebase-realtime-database android-recyclerview android-adapter

我将Firebase用作后端系统,并且还将Recycler View用于向用户显示数据。但是,当从数据库中获取数据时,getValue()方法将返回null。 我在下面附加了我的代码:

public class Post {
    private String desc;
    private String image;

    public  Post()
    {}

    public Post(String desc,String image)
    {
        this.image= image;
        this.desc = desc;
    }

    public String getDescription()
    {
        return desc;
    }

    public String getImage(){
        return image;
    }
}

MainActivity的代码:

public class fragment2Activity extends Fragment {

    private RecyclerView recyclerView;
    private RecyclerView.Adapter madapter;
    private RecyclerView.LayoutManager layoutManager;
    private View view;
    private ArrayList<Post> postArrayList;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        view = inflater.inflate(R.layout.fragment2, container, false);
        final DatabaseReference mref= FirebaseDatabase.getInstance().getReference().child("Post");

        recyclerView = (RecyclerView)view.findViewById(R.id.recyclerView);

        recyclerView.setHasFixedSize(true);

        layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);


        mref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    for (DataSnapshot childSnapShot : dataSnapshot.getChildren()) {
                        Post p = childSnapShot.getValue(Post.class);

                        postArrayList.add(p);
                    }
                    madapter = new MyAdapter(postArrayList);
                    recyclerView.setAdapter(madapter);
                }

            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

        return  view;
    }
}

我的数据库:

Fire base database

logcat:

Logcat

任何人都可以找到解决方案吗?

1 个答案:

答案 0 :(得分:0)

您永远不会初始化postArrayList,因此postArrayList.add(p);会导致NullPointerException

解决方案是通常在postArrayList中创建onCreate

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    view = inflater.inflate(R.layout.fragment2, container, false);
    final DatabaseReference mref= FirebaseDatabase.getInstance().getReference().child("Post");

    recyclerView = (RecyclerView)view.findViewById(R.id.recyclerView);

    recyclerView.setHasFixedSize(true);

    layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);

    postArrayList = new ArrayList<Post>(); // <-- this is new

    mref.addListenerForSingleValueEvent(new ValueEventListener() {
相关问题