Android notifyDataSetChanged()在侦听器内不工作
notifyDataSetChanged()在侦听器内不工作 我有一个从Fire base加载数据的子事件侦听器,我正在将数据加载到数组列表中。我需要在数据完全加载时设置适配器。因此,我使用单值事件来标识子事件完成,当我尝试在单值事件侦听器中设置适配器时,它没有设置适配器。请协助 下面是我的代码: 注意:我已经在oncreate方法中设置了适配器Android notifyDataSetChanged()在侦听器内不工作,android,firebase,firebase-realtime-database,android-recyclerview,Android,Firebase,Firebase Realtime Database,Android Recyclerview,notifyDataSetChanged()在侦听器内不工作 我有一个从Fire base加载数据的子事件侦听器,我正在将数据加载到数组列表中。我需要在数据完全加载时设置适配器。因此,我使用单值事件来标识子事件完成,当我尝试在单值事件侦听器中设置适配器时,它没有设置适配器。请协助 下面是我的代码: 注意:我已经在oncreate方法中设置了适配器 db.addListenerForSingleValueEvent(new ValueEventListener() { @Ov
db.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
bigProgressBar.setVisibility(View.GONE);
Log.d("value",abc.toString());// returns empty!!
sampleAdapter.notifyDataSetChanged();
}
}
db.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(final DataSnapshot dataSnapshot, String s) {
if (dataSnapshot != null) {
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
Events job = dataSnapshot.getValue(Events.class);
abc.add( job);
}
});
}
}
我认为
notifyDataSetChanged()
不起作用的原因是它在abc.add(job)
之前被调用,因此适配器在数据添加到ArrayList
之前被更新
如果您使用的是RecyclerView
,我建议您签出此库
或
将数据加载到所有ArrayList
后更新适配器
db.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
bigProgressBar.setVisibility(View.GONE);
for(DataSnapshot child : dataSnapshot.getChildren()) {
Events event = child.getValue(Events.class);
abc.add(job);
}
sampleAdapter.notifyDataSetChanged();
}
}
请注意,
db
是包含事件
数据的根节点。尝试改用.addValueEventListener()
并在addChildEventListener()之后初始化它。因为我就是这样用的,得到了我想要的。附加说明:(1)dataSnapshot
,您应该使用dataSnapshot.exist()
。(2) 为什么要使用handler?有什么特别的原因吗?谢谢你@koceeng,我真的不希望听众总是被叫来。我只想叫它一次。是否有任何可能的方法在singlevalueevent侦听器中设置适配器。1) 谢谢你的评论。我将编辑我的代码。2) 我还有几段代码没有提到:)非常感谢Boonya Kitpitak。这很有道理,但我在添加到Firebase后并没有更新适配器,而是在使用子事件侦听器将所有数据从Firebase加载到ArrayList(abc)后更新适配器。我的重点是,我正在使用子侦听器从Firebase检索数据,并且由于值事件侦听器是在子侦听器之后调用的,所以我正在使用加载的arraylist更新适配器。@Boonya,我已经将数据从Firebase加载到abc,那么为什么我们需要在单值事件侦听器中将数据再次添加到abc。相反,我将在单值事件侦听器中设置适配器。请在这方面为我提供帮助。那么,您在哪里向abc添加了数据?请将代码也包括在内onChildAdded
不是您应该添加到abc
代码的地方。我已经在代码中包括了我在子事件侦听器中添加的数据。事件作业=dataSnapshot.getValue(Events.class);abc.add(作业);非常感谢你,布尼亚。如果我错了,请允许我更正代码,但它目前对我来说运行良好。谢谢你的耐心:)