0

Je souhaite afficher le nom d'utilisateur, mais les problèmes d'index de visage. Tous les marqueurs montrent le même texte.Obtenir des données de Firebase mais face Erreur d'index

J'initialise la valeur de i en haut avec 0. Que puis-je faire la ligne userbattery.setText("user battery:" + fcmUsers.get(i-1).Battery.toString()); qui peut afficher toutes les valeurs de marqueurs séparément?

DatabaseReference UserRef = FirebaseDatabase.getInstance().getReference().child("GPSLocationHistory").child("DevicesLatest"); 
    UserRef.keepSynced(true); 
    new GetDataFromFirebase().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 


    FirebaseDatabase database = FirebaseDatabase.getInstance(); 

    // myRef = database.getReference("GPSLocationHistory/DevicesLatest"); 


    UserRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      latLngList.clear(); 
      mMap.clear(); 
      if (marker != null) { 
       marker.remove(); 
      } 
      Toast.makeText(MapsActivity.this, "change", Toast.LENGTH_SHORT).show(); 
      Iterator<DataSnapshot> dataSnapshots = dataSnapshot.getChildren().iterator(); 
      fcmUsers = new ArrayList<>(); 
      i = 0; 
      while (dataSnapshots.hasNext()) { 
       DataSnapshot dataSnapshotChild = dataSnapshots.next(); 
       ModelClassFireBase fcmUser = dataSnapshotChild.getValue(ModelClassFireBase.class); 
       fcmUsers.add(fcmUser); 
       LatLng latLng = new LatLng(Double.parseDouble(fcmUsers.get(i).lati.toString()), Double.parseDouble(fcmUsers.get(i).longi.toString())); // Use your server's methods 
       latLngList.add(latLng); 
       mark1 = mMap.addMarker(new MarkerOptions().title(fcmUsers.get(i).Battery.toString()).position(latLngList.get(i)));//.icon(BitmapDescriptorFactory.fromResource(R.drawable.female4))); 
       // Toast.makeText(getApplicationContext(), uniqueids.get(i).toString(), Toast.LENGTH_LONG).show(); 
       markerList.add(mark1); 


       i++; 

       if (fcmUsers.size() > 0) { 

       } else { 
        // Display dialog for there is no user available. 
       } 

      } 


     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      // for handling database error 
     } 
    }); 
    mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { 
     @Override 
     public View getInfoWindow(Marker arg0) { 
      return null; 
     } 

     // Defines the contents of the InfoWindow 
     @Override 
     public View getInfoContents(Marker arg0) { 

      // Getting view from the layout file info_window_layout 
      View v = getLayoutInflater().inflate(R.layout.info_widow_layout, null); 

      // Getting the position from the marker 
      LatLng latLng = arg0.getPosition(); 

      // Getting reference to the TextView to set latitude 
      TextView userbattery = (TextView) v.findViewById(R.id.tv_lat); 

      // Getting reference to the TextView to set longitude 
      // TextView tvLng = (TextView) v.findViewById(R.id.tv_lng); 
      // ImageView userimage = (ImageView) v.findViewById(R.id.userimage); 


      userbattery.setText("user battery:" + fcmUsers.get(i-1).Battery.toString()); 

      return v; 

     } 

    }); 

Répondre

1

J'initialize la valeur de i sur le dessus avec 0

Eh bien, ne le font pas. Avoir un indice en tant que variable membre de la classe n'a pas été l'idée correcte

(choses semblables peut dire pour la variable mark1)

Firebase exécute quand elle peut à tout moment inconnu dans le temps.

Votre code, d'autre part pratiquement immédiatement exécute, si i - 1 = 0 - 1 = -1, et aucune liste n'a une position négative. Et non, le réglage i = 1, n'est pas une solution.


Si je comprends bien le code actuel correctement, vous allez seulement pour obtenir le dernier objet dans la liste ...

if(!fcmUsers.isEmpty()) { 
    ModelClassFireBase last = fcmUsers.get(fcmUsers.length() - 1); 
    userbattery.setText(String.valueOf(last.getBattery())); 
} 

Si ce n'est pas le résultat escompté, alors vous avez une liste entière de fcmUsers, mais seulement une fenêtre d'information de carte, donc il n'y a qu'une seule valeur à définir si vous utilisez la variable i, et vous n'en définissez pas par objet, ce qui explique pourquoi toutes les valeurs sont les mêmes .

Vous pouvez utiliser la variable position en place de i - 1, ou, comme tout adaptateur dans Android, obtenir les données sur l'élément à la position actuelle du marqueur qui est fourni

userbattery.setText("user battery:" + arg0.getTitle()); 

également , ne pas oublier de bouger if (fcmUsers.size() > 0) en dehors de la boucle while

+0

non je ne veux pas obtenir le dernier objet de la liste je veux que lorsque l'utilisateur clique sur le marqueur il montre la batterie du marqueur (de la liste fcUsers) il est une application de suivi – Ahmad

+0

chaque marqueur ont des valeurs séparées je veux simplement afficher sur les marqueurs – Ahmad

+0

Vous avez déjà fait 'MarkerOptions() le titre. (FcmUsers.get (i)' lorsque vous avez ajouté le marqueur, alors pourquoi pensez-vous besoin de l'obtenir à nouveau de la liste des utilisateurs? –