Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android notifyDataSetChanged()在侦听器内不工作_Android_Firebase_Firebase Realtime Database_Android Recyclerview - Fatal编程技术网

Android notifyDataSetChanged()在侦听器内不工作

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

notifyDataSetChanged()在侦听器内不工作

我有一个从Fire base加载数据的子事件侦听器,我正在将数据加载到数组列表中。我需要在数据完全加载时设置适配器。因此,我使用单值事件来标识子事件完成,当我尝试在单值事件侦听器中设置适配器时,它没有设置适配器。请协助

下面是我的代码:

注意:我已经在oncreate方法中设置了适配器

  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(作业);非常感谢你,布尼亚。如果我错了,请允许我更正代码,但它目前对我来说运行良好。谢谢你的耐心:)