【发布时间】: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