2017-07-07 137 views
0

我想从某个表中获取recieverUID,然后从另一个表中获取用户名的值以应对UID。 我认为正在发生的事情是,在我设置receivedName Array列表为常量时,因为App运行良好,所以Adapter被设置在receivedNames Array List被提取之前。 请告诉我什么是错在这里,如果这是这样做 这里是我的数据库看起来像正确的方法, Firebase DB如何等待从Firebase数据库中提取数据

我对标签3片段

public class Tab3 extends Fragment { 

private static RecyclerView.Adapter adapter; 
private RecyclerView.LayoutManager layoutManager; 
private static RecyclerView recyclerView; 
private static ArrayList<String> reminderMessages; 
protected static ArrayList<String> receiverNames; 
String senderUID; 
private DatabaseReference mDatabase; 
//Overriden method onCreateView 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 


    //Change R.layout.tab1 in you classes 
    View v = inflater.inflate(R.layout.tab3, container, false); 
    //get current user 
    final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    reminderMessages = new ArrayList<>(); 
    receiverNames = new ArrayList<>(); 


    senderUID = user.getUid(); 
    mDatabase = FirebaseDatabase.getInstance().getReference(); 
    Query query = mDatabase.child("reminders").orderByChild("senderUID").equalTo(senderUID); 

    //Setting size of recycler view as constant 
    recyclerView = (RecyclerView) v.findViewById(R.id.my_recycler_view); 
    recyclerView.setHasFixedSize(true); 

    //Setting Linear Layout 
    layoutManager = new LinearLayoutManager(getActivity()); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 

    query.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      for (DataSnapshot ds : dataSnapshot.getChildren()) { 
       //Getting message from database 
       String message = ds.child("reminderMessage").getValue(String.class); 
       //Adding database to ArrayList 
       reminderMessages.add(message); 
       //Getting ReceiverUID 
       String rUID = ds.child("receiverUID").getValue(String.class); 
       //Getting corresponding username of the ReceiverUID 
       GetName getName = new GetName(); 
       getName.GetName(rUID); 
       reminderMessages.add(message); 
       // Log.d("String names", receiverNames.toString()); 
      } 


      adapter = new DataAdapter(reminderMessages,receiverNames); 
      recyclerView.setAdapter(adapter); 

     } 


     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      //Error in Reaching Database 
      Toast.makeText(getContext(), "Something went Wrong!", Toast.LENGTH_SHORT).show(); 
     } 


    }); 
    //Returning the layout file after inflating 
    return v; 
} 

这里的代码是我的GetName类

public class GetName { 
private FirebaseAuth auth; 
ListView listView; 
private DatabaseReference mDatabase; 
String receiverName; 
public void GetName(String UID){ 
    mDatabase = FirebaseDatabase.getInstance().getReference().child("users"); 

    Query query = mDatabase.orderByKey().equalTo(UID); 
    query.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot2) { 

      // dataSnapshot is the "issue" node with all children with id 0 
      for (DataSnapshot users : dataSnapshot2.getChildren()) { 
       receiverName = users.child("username").getValue(String.class); 

       receiverNames.add(receiverName); 
       Log.d("name retrieved",receiverNames.toString()); 

      } 


     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 




} 

回答

0

为了解决这个问题,请加onDataChange()方法里面你receiverNames的ArrayList的声明,否则将为空。这是由于该方法的异步行为而发生的。如果您想在该方法之外使用这些值,请参阅post的答案。

希望它有帮助。

+0

谢谢,完美的工作。 –