草庐IT

java - Firebase - 尝试将每个用户的数据检索到列表中

coder 2023-12-16 原文

我的应用程序中的每个用户都可以发送和接收好友请求。当用户检查他的好友请求时,我希望应用程序遍历向他发送好友请求的每个用户,并从 实时数据库 中检索他的信息。

这是我的代码来完成这个:

 public void check_For_Friends_And_Requests(){
        String loggedUser=SaveSharedPreference.getLoggedEmail(getApplicationContext());


            final DatabaseReference mDatabase= FirebaseDatabase.getInstance().getReference();
            final DatabaseReference userRef=mDatabase.child("Users").child(loggedUser);

            userRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if (dataSnapshot.exists()){

                        final List<User> friendRequestsReceived_UserList=new ArrayList<>();

                        for (DataSnapshot postSnapshot: dataSnapshot.child("friend_requests_received").getChildren()) {

                            final String senderEmail=postSnapshot.getKey();

                            Toast.makeText(getApplicationContext(),
                                    senderEmail, Toast.LENGTH_SHORT).show();

                            if (senderEmail!=null){
                                mDatabase.child("Users").child(senderEmail).addListenerForSingleValueEvent(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(DataSnapshot dataSnapshot) {
                                        Toast.makeText(getApplicationContext(),
                                                dataSnapshot.child("name").getValue(String.class), Toast.LENGTH_SHORT).show();

                                        friendRequestsReceived_UserList.add(
                                                new User(
                                                        senderEmail,
                                                        dataSnapshot.child("name").getValue(String.class),
                                                       dataSnapshot.child("level").getValue(Integer.class),
                                                        dataSnapshot.child("skill").getValue(Double.class)));

                                    }

                                    @Override
                                    public void onCancelled(DatabaseError databaseError) {

                                    }
                                });

                            }
                        }

                        UserListAdapter friendRequestsReceived_Adapter =
                        new UserListAdapter(getApplicationContext(),
                                R.layout.friend_requests_received_listview_row,
                                friendRequestsReceived_UserList);

                        friendRequestsReceived_ListView.setAdapter(friendRequestsReceived_Adapter);

                    }

                    else
                    connectionErrorGoToMain();
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    connectionErrorGoToMain();
                }
            });


    }

我在这段代码中有 2 个 ValueEventListeners。我将用户信息添加到内部列表中。 问题是在此过程结束时列表为空。

我想用这些信息填充 ListView :

 UserListAdapter friendRequestsReceived_Adapter =
                        new UserListAdapter(getApplicationContext(),
                                R.layout.friend_requests_received_listview_row,
                                friendRequestsReceived_UserList);

                        friendRequestsReceived_ListView.setAdapter(friendRequestsReceived_Adapter);

当我将它们放在内部监听器中时,它工作正常,但我不想为列表中的每个用户设置适配器,仅在 for 循环之后。

我附上了我的数据库结构的屏幕截图(我不需要获取所有参数):

最佳答案

列表为空,因为您在内部 onDataChange() 方法之外声明了 friendRequestsReceived_UserList。这是由于在将这些新对象添加到列表之前调用的 onDataChange() 方法的异步行为而发生的。因此,为了解决这个问题,只需将列表的声明移到内部 onDataChange() 方法中,如下所示:

if (senderEmail!=null){
mDatabase.child("Users").child(senderEmail).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        final List<User> friendRequestsReceived_UserList=new ArrayList<>(); //Moved here

    Toast.makeText(getApplicationContext(), dataSnapshot.child("name").getValue(String.class), Toast.LENGTH_SHORT).show();

    friendRequestsReceived_UserList.add(
        new User(
            senderEmail,
            dataSnapshot.child("name").getValue(String.class),
                dataSnapshot.child("level").getValue(Integer.class),
            dataSnapshot.child("skill").getValue(Double.class)));
            UserListAdapter friendRequestsReceived_Adapter =

     new UserListAdapter(getApplicationContext(), R.layout.friend_requests_received_listview_row, friendRequestsReceived_UserList);
     friendRequestsReceived_ListView.setAdapter(friendRequestsReceived_Adapter);

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

正如您可能看到的那样,我也在内部方法中设置了适配器。如果您想在 onDataChange() 之外使用该列表,我建议您阅读我从这个 post 中得到的答案。 .

关于java - Firebase - 尝试将每个用户的数据检索到列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45521162/

有关java - Firebase - 尝试将每个用户的数据检索到列表中的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - RVM 使用列表[0] - 2

    是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  6. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

随机推荐