首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java List<Object>大小

Java List<Object>大小
EN

Stack Overflow用户
提问于 2019-06-25 21:02:57
回答 4查看 83关注 0票数 0

我在java android中有一个列表:

代码语言:javascript
复制
List<FirebaseData> GetListMap(String data){

    final List<FirebaseData> Elements = new ArrayList<>();

    FirebaseDatabase database = FirebaseDatabase.getInstance();

    mShiftReference = database.getReference("Map/Data/").child(data);

    mListener = mShiftReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

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

                Elements.add(child.getValue(FirebaseData.class));
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            // Failed to read value
            Log.w("data", "Failed to read value.", error.toException());
        }
    });

    return Elements;
}

当我试图超出数组的大小时,它返回0,例如:

代码语言:javascript
复制
int size = GetListMap("2019-06-24").size();

否则我就不能超过任何财产。

知道我做错什么了吗。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-06-26 06:07:03

在firebase完成添加所有内容之前,您将返回列表。您希望为函数创建一个接口方法。

在类中创建一个接口:

代码语言:javascript
复制
public interface Complete{
    void taskCompleted(List<FirebaseData> list);
}

然后将其分配给您的方法(当接口生成结果时,现在返回void ):

代码语言:javascript
复制
public void GetListMap(String data, Complete completeListener){

. . . .

mListener = mShiftReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot child: dataSnapshot.getChildren()) {
            Elements.add(child.getValue(FirebaseData.class));
        }

        completeListener.taskComplete(Elements);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
            completeListener.taskComplete(null);
        }
    });

}

使用方法:

代码语言:javascript
复制
GetListMap("data", new Complete() {
                    @Override
                    public void taskCompleted(List<FirebaseData> list) {
                        //do what you want with the list object
                    }
                });
票数 1
EN

Stack Overflow用户

发布于 2019-06-25 21:06:49

首先,我假设您指的是int size = GetListMap("2019-06-24").size(); (末尾的大小)。

其次,您要将一个列表分配给返回的值,此时它是一个空列表。然后附加一个等待事件(数据更改)的侦听器,如果发生这种情况,那么它将向列表中添加一个元素。

基本上,除非发生数据更改事件,否则列表将始终为空。您需要触发一个事件,然后检查列表,它应该改变它的大小。

票数 3
EN

Stack Overflow用户

发布于 2019-06-25 21:10:56

由于侦听器的异步特性,在元素集合实际从Firebase数据库获取数据之前,您将返回它。

如果要在异步代码完成后获得更新,则必须定义回调。

代码语言:javascript
复制
List<FirebaseData> GetListMap(String data){

final List<FirebaseData> Elements = new ArrayList<>();

FirebaseDatabase database = FirebaseDatabase.getInstance();

mShiftReference = database.getReference("Map/Data/").child(data);

mListener = mShiftReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        System.out.println("About to fill Elements");
        for (DataSnapshot child: dataSnapshot.getChildren()) {

            Elements.add(child.getValue(FirebaseData.class));
        }
        System.out.println("Elements is filled");

    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        // Failed to read value
        Log.w("data", "Failed to read value.", error.toException());
    }
});
System.out.println("Returning Elements with size: " + Elements.size());
return Elements;
}
int x = GetListMap("...").size();
System.out.println("x: +" x);

该代码将产生以下输出:

  1. 返回大小为0的元素
  2. x: 0
  3. 即将填充元素
  4. 元素被填充

顺便说一句,在用Java开发时,请使用camelCase作为您的方法和变量。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56761957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档