【问题标题】:Cannot get list size from Firebase on Android无法从 Android 上的 Firebase 获取列表大小
【发布时间】:2016-04-18 08:45:53
【问题描述】:

我的日志可以打印所有Exercise 对象。但是当我打电话时listExercise 为空。有什么问题?

ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                Exercise exercise = postSnapshot.getValue(Exercise.class);
                String temp = exercise.toString();
                Log.d("exercise: ", temp + "\n"); // can log all
                listExercises.add(exercise);
            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            Log.d("The read failed: ", firebaseError.getMessage());
        }
    });
Log.d("LISTSIZE: ", String.valueOf(listExercises.size())); // return 0

[更新]任何人都需要的答案:

@Override
        public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                Exercise exercise = postSnapshot.getValue(Exercise.class);
                listExercises.add(exercise);
            }
            // action with data here
            Exercise ex = listExercises.get(0);
            tvQuestion.setText(ex.getQuestion);
        }

【问题讨论】:

  • 你得到一些错误堆栈跟踪吗?
  • 不,我登录时它只返回一个空列表:Log.d("LISTSIZE: ", String.valueOf(listExercises.size()));
  • 可能您在插入练习之前正在检查列表。请注意,这是异步工作的。将“LISTSIZE”的Log放在listExercises.add(exercise);之后
  • 当然,我把“LISTSIZE”的日志放在listExercises.add(exercise);之后。我将编辑我的问题以获取更多详细信息。
  • 您的 listExcercise 是 List 的自定义实现还是 class 练习在方法 toString(); 中做某事?也许如果你把剩下的代码我可以帮助你更好:)

标签: android firebase firebase-realtime-database


【解决方案1】:

当调用“paintListInScreen”方法时,您肯定知道列表有一些内容(或者可能没有,这取决于服务器,但您与线程保持一致)。

ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        for (DataSnapshot postSnapshot : snapshot.getChildren()) {
            Exercise exercise = postSnapshot.getValue(Exercise.class);
            String temp = exercise.toString();
            Log.d("exercise: ", temp + "\n"); // can log all
            listExercises.add(exercise);
        }
         Log.d("LISTSIZE: ", String.valueOf(listExercises.size())); // return 0
        paintListInScreen(listExercises);
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {
        Log.d("The read failed: ", firebaseError.getMessage());
    }
});

【讨论】:

  • 谢谢,我会试试的
  • 你是对的,jDur。经过我的尝试,我发现有两点我们可以使用我得到的数据:第一,是onDataChange方法之后的时间。第二,当你在同步数据后做一些动作时,可能是按钮的onClick ...等。
  • 欢迎您:)。如果您认为这是一个正确的答案,请将其标记为正确,以便其他用户发现它有帮助。
【解决方案2】:

对于 Java 8 和更新版本(对于 Android API 级别 24 是必需的):

int size = dataSnapshot.getChildren().spliterator().getExactSizeIfKnown() ;

对于旧版本:

int size = 0 
for (DataSnapshot postSnapshot : snapshot.getChildren()) {
    size++ ;
}

【讨论】:

  • 最上面的也需要API 24
【解决方案3】:

获取datasnapshot对象的大小:

dataSnapshot.getChildrenCount();

【讨论】:

    猜你喜欢
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    相关资源
    最近更新 更多