0

Ich habe ein paar Probleme mit einer Android-Liste. Ich habe eine Methode, die eine Liste von Spielern erstellt und die Spieler aus der Datenbank und dem Speicher der Firebase lädt.Android Firebase Speicher, Innerclass Download auf Bitmap

Einige Spieler haben Profilbilder und sie werden als generierter Schlüssel in storage/players/keyname gespeichert (der eindeutige Schlüssel eines Spielers in der Datenbank ist der Profilbildname im Firebase-Speicher).

Das Problem, das ich habe, ist, wenn ich versuche, den OnSuccessListener/Player zu erstellen. Ich kann die Daten einfach nicht weitergeben.

Probleme mit der onSuccessListener:

  • außerhalb Alles ist ein „outerclass“ betrachtet, was bedeutet, wenn ich einen Spieler erstellen möchten sie nicht die Daten innerhalb des onsuccesslistener lesen kann.
  • alles Innere kann keine Daten außerhalb des Zuhörers weitergeben.
  • Ich kann es nicht konvertieren in Bitmap

Ich muss in der Lage sein zu schaffen „Spieler p“ mit Daten aus dem Hörer und der Map-Eintrag. Bis jetzt bin ich gescheitert (kann beide nicht passieren).

//Method to create the list of players. To do: call again after adding new player 
public void createPlayerList(){ 
    //The list of players that will be filled 
    final List listPlayers = new ArrayList<Player>(); 

    //The path where all our players are stored. 
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users") 
      .child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("team").child("players"); 


    //Method that just gets called once 
    ref.addListenerForSingleValueEvent(new ValueEventListener() { 

     //dataSnapshot contains all data from the path to our players 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Map<String, Object> players = (Map<String, Object>) dataSnapshot.getValue(); 

      //We return our player data in a map. Loop through each value in the map and create a player object for each player 
      //And add that player object to our list of players 

      //Create Storage instance 
      FirebaseStorage storage = FirebaseStorage.getInstance(); 
      //Create storageReference 
      final StorageReference storageRef = storage.getReferenceFromUrl("gs://bucket.appspot.com"); 

      // Create a reference to a file from a Google Cloud Storage URI 
      StorageReference gsReference = storage.getReferenceFromUrl(storageRef + "/players/"); 


      for (Map.Entry<String, Object> entry : players.entrySet()){ 
       Map singlePlayer = (Map) entry.getValue(); 

       //Get unique key 
       String key = entry.getKey(); 

       storageRef.child(key).getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { 
        @Override 
        public void onSuccess(Uri uri) { 
         //Picasso.with(getActivity()).load(uri).into(R.id.playerProfilePicture); 
        } 
       }).addOnFailureListener(new OnFailureListener() { 
        @Override 
        public void onFailure(@NonNull Exception exception) { 
         // Handle any errors 
        } 
       }); 

       //standard mage 
       Bitmap profileBits = BitmapFactory.decodeResource(getResources(), R.drawable.player_icon); 
       PlayersFragment.this.setProfilePicture(profileBits); 

       //Create player 
       Player p = new Player((String) singlePlayer.get("name"), (String) singlePlayer.get("preferredPosition"), profilePicture ); 

       //Add player to list 
       listPlayers.add(p); 
      } 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 

    //Add all results from database to our listview 
    listViewPlayers = (ListView) fragmentView.findViewById(R.id.players_list); 

    //Attach adapter to listview, to get a layout for each row 
    listViewPlayers.setAdapter(new PlayerAdapter(getActivity(), R.layout.row_player_list_item, listPlayers)); 
    //Necessary for handling clicks 
    listViewPlayers.setItemsCanFocus(true); 

} 

Antwort

1

Denken Sie daran, dass addListenerForSingleValueEvent sofort zurück. Der Listener, an den Sie ihn übergeben, wird später aufgerufen. Wie es jetzt aussieht, sieht es so aus, als ob Sie erwarten, dass es blockiert, bis das Ergebnis verfügbar ist und listPlayers vollständig gefüllt ist.

Stattdessen empfehle ich den Umgang mit listViewPlayers in Ihrem onDataChange-Callback, unmittelbar nachdem Ihre Liste von Spielern bekanntermaßen aufgefüllt ist.

Beachten Sie auch, dass gsReference anscheinend nirgends verwendet wird. Bist du sicher, dass du nicht gesagt hast gsReference.child(key).getDownloadUrl()..., um unter dem "players" -Ordner nach jedem gefundenen Spieler in der Schleife zu suchen?

+0

Sie haben Recht. Ich habe es geändert. – user1692823

Verwandte Themen