我在java android中有一个列表:
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,例如:
int size = GetListMap("2019-06-24").size();否则我就不能超过任何财产。
知道我做错什么了吗。
发布于 2019-06-26 06:07:03
在firebase完成添加所有内容之前,您将返回列表。您希望为函数创建一个接口方法。
在类中创建一个接口:
public interface Complete{
void taskCompleted(List<FirebaseData> list);
}然后将其分配给您的方法(当接口生成结果时,现在返回void ):
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);
}
});
}使用方法:
GetListMap("data", new Complete() {
@Override
public void taskCompleted(List<FirebaseData> list) {
//do what you want with the list object
}
});发布于 2019-06-25 21:06:49
首先,我假设您指的是int size = GetListMap("2019-06-24").size(); (末尾的大小)。
其次,您要将一个列表分配给返回的值,此时它是一个空列表。然后附加一个等待事件(数据更改)的侦听器,如果发生这种情况,那么它将向列表中添加一个元素。
基本上,除非发生数据更改事件,否则列表将始终为空。您需要触发一个事件,然后检查列表,它应该改变它的大小。
发布于 2019-06-25 21:10:56
由于侦听器的异步特性,在元素集合实际从Firebase数据库获取数据之前,您将返回它。
如果要在异步代码完成后获得更新,则必须定义回调。
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);该代码将产生以下输出:
顺便说一句,在用Java开发时,请使用camelCase作为您的方法和变量。
https://stackoverflow.com/questions/56761957
复制相似问题