【问题标题】:Not able to access inner class data from outer class in Android无法从 Android 中的外部类访问内部类数据
【发布时间】:2018-07-16 06:02:20
【问题描述】:

这是我的代码。我无法访问注册集合中的用户名。我正在获取价值,但无法从外部访问。

所以请告诉我一些方法。

我还粘贴了我的数据库的快照,有两个表我需要从中访问数据并显示然后显示在回收站视图中。需要以列表格式显示值。

enter image description here

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    recyclerView=(RecyclerView)findViewById(R.id.recycler);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    listItems=new ArrayList<>();
    mAuth = FirebaseAuth.getInstance();

    databaseReference= FirebaseDatabase.getInstance().getReference();
    databaseReference.child("post").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                post p=ds.getValue(post.class);
                String user=p.getUid();
              final  String nh,nd;
                nh=p.getNewsHeading();
                nd=p.getNewsDiscription();

                databaseReference= FirebaseDatabase.getInstance().getReference();
                databaseReference.child("signUp").child(user).addListenerForSingleValueEvent(new ValueEventListener() {

                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        signUp s=dataSnapshot.getValue(signUp.class);
                        Toast.makeText(MainActivity.this, s.getUser(), Toast.LENGTH_SHORT).show();
//want to access username from outside

                        userName =s.getUser();

                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }

                });

                p=new post(nh,nd,userName);
                listItems.add(p);
            }
            listItems.add(new post("hdfsgidsf","d,hdjh","ramu babu")) ;
            myAdapter adapter;
            adapter=new myAdapter(listItems,getApplicationContext());
            recyclerView.setAdapter(adapter);


        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });



    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    setSupportActionBar(toolbar);



    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    //******************************************************************************************************

}

【问题讨论】:

  • ondatachange 是一种异步方法
  • “外面”在哪里?您可以编写一个扩展ValueEventListenerMyValueEventListener 类,但也提供了一种访问最新版本用户名的方法。然后使用变量MyValueEventListener myVEL = new MyValueEventListener(){...} 将其添加为child("post") 的侦听器,稍后使用myVEL.getUsername() 左右访问用户名。我知道这可能是一个答案,但我想首先验证这是否适合您的问题
  • 我无法理解您所说的方法

标签: java android firebase firebase-realtime-database


【解决方案1】:

Firebase API 是 asynchronous,这意味着 onDataChange() 方法在被调用后会立即返回,并且它返回的 Task 的回调将在稍后调用。无法保证需要多长时间。因此,在数据可用之前可能需要几百毫秒到几秒钟。因为该方法会立即返回,所以您尝试在 onDataChange() 方法之外使用的 userName 变量的值不会从回调中填充。

基本上,您尝试从异步 API 同步返回值。这不是一个好主意。您应该按预期异步处理 API。

此问题的快速解决方案是仅在 onDataChange() 方法内使用 userName 字符串,否则我建议您从 post 中查看我的答案的最后部分我已经解释了如何使用自定义回调来完成。您也可以看看这个 video 以获得更好的理解。

编辑: 2021 年 2 月 26 日

更多信息,您可以查看以下文章:

还有以下视频:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    相关资源
    最近更新 更多