【问题标题】:Array List becomes empty after addListenerForSingleValueEvent listener methodaddListenerForSingleValueEvent 监听器方法后数组列表变为空
【发布时间】:2019-06-25 05:50:27
【问题描述】:

我正在从 firebase 数据库中获取数据到 recyclerview。我无法将数据获取到 RecyclerViewAdapter,因为在 addListenerForSingleValueEvent 方法之后 Array 列表变为空。

@Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.fragment_dashboard, container, false);
        database = FirebaseDatabase.getInstance();
        ArrayList<Item> arr = new ArrayList<Item>();


        DatabaseReference reference = database.getReference("NoticeBoard");

        reference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {

                    String text1 = (String) singleSnapshot.child("Text1").getValue();
                    String text2 = (String) singleSnapshot.child("Text2").getValue();

                    arr.add(new Item(text1, text2));
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });

        RecyclerViewAdapter adapter = new RecyclerViewAdapter(getContext(), arr);// Here the ArrayList arr is empty

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

        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setAdapter(adapter);

        return view;
    }

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    onDataChange() 是异步的,因此由于您在addListenerForSingleValueEvent 之后调用arraylist,它将返回一个空列表,因为尚未检索到数据。

    要解决你的问题,你需要在onDatachange()里面添加arrayList:

            reference.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    
                    for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
    
                        String text1 = (String) singleSnapshot.child("Text1").getValue();
                        String text2 = (String) singleSnapshot.child("Text2").getValue();
                        ArrayList<Item> arr = new ArrayList<Item>();
                        arr.add(new Item(text1, text2));
    
                        RecyclerViewAdapter adapter = new RecyclerViewAdapter(getContext(), arr);
                        RecyclerView recyclerView = view.findViewById(R.id.dashboardRecyclerView);
    
                        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
                        recyclerView.setAdapter(adapter);
                    }
                }
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                }
            });
    

    【讨论】:

      【解决方案2】:

      Firebase 数据库调用不是异步的,这意味着查询下面的行将在您从 firebase 获得响应之前执行。

      所以更新您的代码如下以按预期工作。

       RecyclerViewAdapter adapter;
      
       @Override
       public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
          final View view = inflater.inflate(R.layout.fragment_dashboard, container, false);
          database = FirebaseDatabase.getInstance();
          ArrayList<Item> arr = new ArrayList<Item>();
      
          adapter = new RecyclerViewAdapter(getContext(), arr);// Here the ArrayList arr is empty
      
          RecyclerView recyclerView = view.findViewById(R.id.dashboardRecyclerView);
      
          recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
          recyclerView.setAdapter(adapter);
      
          DatabaseReference reference = database.getReference("NoticeBoard");
      
          reference.addListenerForSingleValueEvent(new ValueEventListener() {
              @Override
              public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
      
                  for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
      
                      String text1 = (String) singleSnapshot.child("Text1").getValue();
                      String text2 = (String) singleSnapshot.child("Text2").getValue();
      
                      arr.add(new Item(text1, text2));
                  }
                  if(adapter != null){
                     adapter.notifyDataSetChanged();
                  }
              }
              @Override
              public void onCancelled(@NonNull DatabaseError databaseError) {
              }
          });
      
          return view;
      }
      

      注意事项: 最好在片段中创建视图后设置数据。您可以为此使用片段的onViewCreated() 方法。

      【讨论】:

      • 感谢您的快速回复和最后的说明!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多