无法从Android中的外部类访问内部类数据

时间:2018-07-16 06:02:20

标签: java android firebase firebase-realtime-database

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

所以请告诉我一些方法。

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

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

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

}

1 个答案:

答案 0 :(得分:1)

Firebase API为asynchronous,这意味着onDataChange()方法在调用后立即返回,并且它返回的Task中的回调将在一段时间后调用。无法保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。由于该方法会立即返回,因此您尚未尝试从userName方法之外使用它的onDataChange()变量的值。

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

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