【问题标题】:using Arraylist.add() function in a loop在循环中使用 Arraylist.add() 函数
【发布时间】:2020-04-23 21:20:34
【问题描述】:

我想在 Android 应用程序中制作一个通知片段,因为我有一个如下所示的 firebase 数据库

{
  "comments" : {
    "-M5TzP6GKDal61bEUY66" : {
      "-M5bP5nDhmEcHRij05SE" : {
        "comment" : "salaaaam",
        "username" : "snoussi khalil"
      }
    },
    "-M5co-nrZ8RxdFiuR_Vl" : {
      "-M5co92GjJDbs5mqTnp1" : {
        "comment" : "first",
        "username" : "omar kinani"
      },
      "-M5co9TwnSqcNzELI46x" : {
        "comment" : "first",
        "username" : "omar kinani"
      },
      "-M5coCPjicyKVeEC61B1" : {
        "comment" : "first",
        "username" : "omar kinani"
      },
      "-M5coE2WHdGrBGEi1QCn" : {
        "comment" : "first",
        "username" : "omar kinani"
      },
      "-M5coj-Z8jPekGDre3Ie" : {
        "comment" : "yea",
        "username" : "omar kinani"
      }
    }
  },
  "posts" : {
    "-M5TbWiSlgN7lW4_vJkm" : {
      "author" : "snoussi khalil",
      "lat" : 34.0401902,
      "longt" : -4.9937379,
      "txt" : "hello there guys"
    },
    "-M5TjFWG7abQnap0IOPH" : {
      "author" : "snoussi khalil",
      "lat" : 34.0401842,
      "longt" : -4.9937646,
      "txt" : "bonjor"
    },
    "-M5TzP6GKDal61bEUY66" : {
      "author" : "snoussi khalil",
      "lat" : 34.0401748,
      "longt" : -4.9937932,
      "txt" : "dude"
    },
    "-M5co-nrZ8RxdFiuR_Vl" : {
      "author" : "omar kinani",
      "txt" : "hey"
    }

为了检索作者等于用户 ID 的帖子的 cmets,我做了两个 for 循环,并尝试在每个帖子的 cmets 中附加一个 Arraylist。我的问题是:我的 Arraylist 在循环外是空的,但包含元素在循环内,我知道是因为我使用了 LOG.d() 函数来仔细查看正在发生的事情。

public class NotifFragment extends Fragment {

    private FirebaseDatabase database;
    private DatabaseReference postRef;
    private DatabaseReference comRef;
    private FirebaseAuth mAuth;

    private List<String> comments;


    @Nullable
    @Override
    public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
         View view = inflater.inflate(R.layout.fragment_notification,container,false);
         //database init
         database = FirebaseDatabase.getInstance();
         postRef = database.getReference("posts");
         comRef = database.getReference("comments");
         //user init
         mAuth = FirebaseAuth.getInstance();
         final String username = mAuth.getCurrentUser().getDisplayName();


         //init an empty arraylist for comments

        comments = new ArrayList<>();

         postRef.addValueEventListener(new ValueEventListener() {
             @Override
             public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                 for (final DataSnapshot keynode : dataSnapshot.getChildren()){
                    String author = keynode.child("author").getValue(String.class);
                    if (author.equals(username)){
                        comRef.child(keynode.getKey()).addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshot1) {
                                for (DataSnapshot item:dataSnapshot1.getChildren()){
                                    String comment = item.child("comment").getValue(String.class);
                                    Log.d("sos",""+comment+"and list size: "+comments.size());
                                    comments.add(comment);


                                }

                            }

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

                            }
                        });
                    }
                 }

             }

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

             }
         });

         Log.d("sos","your final list size is : "+comments.size());



        return  view;
    }
}

我已经执行了应用程序并将虚拟 cmets 添加到三个 cmets "first" 的帖子中,第四个是是的,arraylist 实际上在循环内变大了,但最终在循环外时大小为零。

和 LOGCAT:

12020-04-23 22:12:49.372 1664-1664/com.snoussi.univox D/sos: your final list size is : 0
2020-04-23 22:12:51.340 1664-1664/com.snoussi.univox D/sos: firstand list size: 0
2020-04-23 22:12:51.341 1664-1664/com.snoussi.univox D/sos: firstand list size: 1
2020-04-23 22:12:51.342 1664-1664/com.snoussi.univox D/sos: firstand list size: 2
2020-04-23 22:12:51.343 1664-1664/com.snoussi.univox D/sos: firstand list size: 3
2020-04-23 22:12:51.344 1664-1664/com.snoussi.univox D/sos: yeaand list size: 4

【问题讨论】:

  • 你最终的列表大小是在接收和解析之后(在循环中),所以在onDataChange方法的末尾。在您的onCreateView 列表末尾是空的,因为尚未收到数据。
  • 你试过调试吗?
  • @RobOhRob 存在问题,您在侦听器中接收数据,可以调用例如充气并执行 `onCreateView 方法后 2 分钟。
  • @Boken 好的,但是我如何制作我的最终数组列表的恒定副本?我想用它来制作一个 ListView。
  • @RobOhRob 是的,我做到了,但我没有得到任何东西,因为我没有遇到崩溃。

标签: java android firebase-realtime-database


【解决方案1】:

您稍后会收到数据。膨胀布局比从 Firebase 获取数据更快。

所以是的,onCreateView() 方法列表的末尾是空的,因为您稍后会收到它们(在侦听器中)。

当你需要在某个列表中显示数据时,你必须在onDataChange()方法中做:

public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    // Parse data
    // Show data in the list
}

【讨论】:

    【解决方案2】:

    它是一个侦听器,在收集数据和显示列表之间存在延迟。因为延迟所以没有数据存在

    你可以在你的日志中看到它——首先你会看到它:com.snoussi.univox D/sos:你的最终列表大小是:0 虽然它写在其他日志之后

    【讨论】:

    • 很高兴我能帮上忙
    猜你喜欢
    • 2014-02-27
    • 2020-06-03
    • 1970-01-01
    • 2022-10-21
    • 2013-10-16
    • 2013-12-28
    • 2013-11-23
    • 2014-06-19
    • 2021-06-01
    相关资源
    最近更新 更多