0

У меня есть класс адаптера RecylerView, который предназначен для пользователей сообщений. То, что я пытаюсь сделать, это получить информацию почтовые авторы через Firebase, а затем связать эту информацию в должность в onBindViewHolder()Получение данных Firebase в recyclerview

Моя проблема заключается в том, что, когда я называю getPostAuthorInfo() (который используется только для получения данных из firebase) в onBindViewHolder() метод является асинхронным, так что я не в состоянии связать свойства, потому что данные (Muser) еще не готов:

Picasso.with(mContext).load(mUser.getProfilePictureImageUrl()).into(viewHolder.authorsProfilePicture); 

Может кто-то помочь мне понять, если я подхожу это неправильный путь, или просто не делать это правильно?

Thank you.

private void getPostAuthorInfo(final String userId) { 
    mFirebaseDatabase.child(userId).addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
      String firstName = ""; 
      String lastName = ""; 
      String dateAccountCreated = ""; 
      String email = ""; 
      String userId = ""; 
      String username = ""; 
      Boolean isMale = false; 
      Boolean isFemale = false; 
      Boolean isOther = false; 
      String biography = ""; 
      String location = ""; 
      String profilePictureImageUrl = ""; 
      String profilePictureImageName = ""; 
      String profilePictureCaptionName = ""; 
      HashMap <String, String> profileInformation = new HashMap<>(); 
      for (DataSnapshot child : snapshot.getChildren()) { 
       firstName = (String) snapshot.child("firstName").getValue(); 
       lastName = (String) snapshot.child("lastName").getValue(); 
       dateAccountCreated = (String) snapshot.child("dateAccountCreated").getValue(); 
       email = (String) snapshot.child("email").getValue(); 
       userId = (String) snapshot.child("userId").getValue(); 
       username = (String) snapshot.child("username").getValue(); 
       isMale = (Boolean) snapshot.child("male").getValue(); 
       isFemale = (Boolean) snapshot.child("female").getValue(); 
       isOther = (Boolean) snapshot.child("other").getValue(); 
       biography = (String) snapshot.child("biography").getValue(); 
       location = (String) snapshot.child("location").getValue(); 
       profilePictureImageUrl = (String) snapshot.child("profilePictureImageUrl").getValue(); 
       profilePictureImageName = (String) snapshot.child("profilePictureImageName").getValue(); 
       profilePictureCaptionName = (String) snapshot.child("profilePictureCaptionName").getValue(); 
       profileInformation = (HashMap) snapshot.child("profileInformation").getValue(); 
      } 
      mUser = new User(userId, firstName, lastName, username, email, isMale, 
        isFemale, isOther, dateAccountCreated, biography, location, 
        profilePictureImageUrl, profilePictureImageName, profilePictureCaptionName, profileInformation); 
      Log.i(TAG, "Currently signed in user: " + mUser.toString()); 
     } 

     @Override 
     public void onCancelled(DatabaseError error) { 
      // Failed to read value 
      Log.e(TAG, "Failed to retrieve signed in user", error.toException()); 
     } 
    }); 
} 
+1

человек опубликовал весь код, вы только что разместили ненужный материал Пикассо –

+0

Считаете ли вы использование библиотеки FirebaseUI? –

+0

@ cricket_007 Да. Я просто слишком далеко использую обычные адаптеры для переключения сейчас. – Fernando

ответ

1

Является ли «сообщение» единственной вещью, и вы просто хотите получить информацию об авторе?

Вы можете извлечь свой обратный вызов в метод для рекомендуемого шаблона вызова метода async.

private void getPostAuthorInfo(final String userId, ValueEventListener listener) { 
    mFirebaseDatabase.child(userId).addListenerForSingleValueEvent(listener); 
} 

Тогда, когда вы вызываете этот метод, вы можете получить доступ к своему представлению изображения.

ImageView authorsProfilePicture; 
Context mContext; 

api.getPostAuthorInfo("id-xyz", new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
     String profilePictureImageUrl = (String) snapshot.child("profilePictureImageUrl").getValue(); 

     Picasso.with(mContext) 
      .load(profilePictureImageUrl) 
      .into(authorsProfilePicture); 
    } 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^