【问题标题】:notifyDataSetChanged() is not Working inside listenersnotifyDataSetChanged() 在侦听器内部不起作用
【发布时间】:2017-03-27 15:04:43
【问题描述】:

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);





                    }
                });

            }

        }

【问题讨论】:

  • 尝试使用.addValueEventListener() 并在addChildEventListener() 之后对其进行初始化。因为我就是这样使用它并得到我想要的。附加说明:(1)dataSnapshotwill never be null,你应该使用dataSnapshot.exist()。 (2)你为什么使用处理程序?有什么特别的原因吗?
  • 谢谢@koceeng,我真的不希望监听器总是被调用。我希望它只被调用一次。有没有办法在单值事件监听器中设置适配器。 1)感谢cmets。我将编辑我的代码。 2)我还有一些我没有提到的代码:)

标签: android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

我认为notifyDataSetChanged() 不起作用的原因是它在abc.add( job) 之前被调用,因此适配器在数据添加到您的ArrayList 之前更新。

如果您使用的是RecyclerView,我建议您查看此库。 https://github.com/firebase/FirebaseUI-Android

将数据加载到所有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是根节点,包含你Event的数据。

【讨论】:

  • 非常感谢 Boonya Kitpitak。这很有意义,但我不会在添加到 Firebase 后更新适配器,而是在将所有数据加载到 ArrayList(abc) 后更新适配器从 Firebase 使用子事件侦听器。我的重点是,我正在使用子侦听器从 Firebase 检索数据,并且由于在子侦听器之后调用值事件侦听器,因此我正在使用加载的 arraylist 更新适配器。
  • @Boonya,我已经将数据从 Firebase 加载到 abc,那么为什么我们需要在单值事件监听器中再次将数据添加到 abc。相反,我将在单值事件侦听器中设置适配器。请在这方面帮助我
  • 那你在哪里把数据添加到abc 请同时附上代码。 onChildAdded 不是您应该添加到abc 代码的地方。
  • 我已经包含在代码中,我已经在子事件监听器中添加了数据。事件作业 = dataSnapshot.getValue(Events.class); abc.add(job);
  • 非常感谢 Boonya。如果我错了,让我更正代码,但到目前为止它对我来说很优雅。感谢您的耐心等待:)
猜你喜欢
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
相关资源
最近更新 更多