0

Androidのリストに問題があります。私はプレーヤーのリストを作成し、firebaseのデータベースとストレージからプレーヤーをロードする方法を持っています。AndroidのFirebaseストレージ、インクラスのビットマップへのダウンロード

プレーヤーの中には、プロフィールピクチャがあり、storage/players/keynameで生成されたキーとして保存されています(データベース内のプレーヤーのユニークキーは、Firebaseストレージのプロファイルピクチャ名です)。

私が持っている問題は、OnSuccessListener/playerを作成しようとするときです。私はちょうどデータを渡すように見えることはできません。 onSuccessListenerと

問題が:外

  • すべては、私はそれがonsuccesslistener内のデータを読み取ることができないプレーヤーを作成する場合を意味し、「outerclass」と考えられています。
  • 内部のすべてがリスナーの外部にデータを渡すことはできません。
  • 私はそれは私がリスナーとマップエントリからのデータを「プレイヤーP」を作成できるようにする必要があり

ビットマップに変換することはできません。これまでのところ、私は失敗しました(両方をパスすることはできません)。

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

} 

答えて

1

addListenerForSingleValueEventは即座に戻ります。それに渡すリスナーは、しばらくしてから呼び出されます。今のように、結果が利用可能になり、listPlayersが完全に実装されるまでブロックすることを期待しているようです。

代わりに、プレーヤーのリストに値が設定されていることがわかった直後に、あなたのonDataChangeコールバックからlistViewPlayersを処理することをお勧めします。

また、gsReferenceはどこにも使用されていないことに注意してください。あなたはループ内に見つかった各プレイヤーの "players"フォルダを見るためにと言っても意味はありませんか?

+0

あなたは正しいです。私はそれを変えた。 – user1692823

関連する問題