这是我的代码。我无法访问signUp集合中的用户名。我正在获取价值,但无法从外部访问。
所以请告诉我一些方法。
我还粘贴了数据库快照,我需要从两个表访问数据并进行显示,然后在回收器视图中显示它们。需要以列表格式显示值。
@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);
//******************************************************************************************************
}
答案 0 :(得分:1)
Firebase API为asynchronous
,这意味着onDataChange()
方法在调用后立即返回,并且它返回的Task中的回调将在一段时间后调用。无法保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。由于该方法会立即返回,因此您尚未尝试从userName
方法之外使用它的onDataChange()
变量的值。
基本上,您正在尝试从异步的API同步返回值。那不是一个好主意。您应该按预期异步处理API。
此问题的快速解决方案是仅在userName
方法内使用onDataChange()
字符串,否则我建议您从此 {{3} } ,其中我解释了如何使用自定义回调来完成。您也可以查看此 post 以获得更好的理解。