从 firebase 获取数据但面临索引错误

getting data from firebase but face Index error

我想显示用户名,但遇到索引问题。所有标记都显示相同的文本。

我在上面用0初始化了i的值。 userbattery.setText("user battery:" + fcmUsers.get(i-1).Battery.toString());行可以单独显示所有标记值,我该怎么做?

 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;

        }

    });

I initialize the value of i on the top with 0

好吧,不要。将索引作为 class 的成员变量并不是正确的想法

(对于 mark1 变量可以说类似的事情)

Firebase 会在任何未知的时间点执行。

另一方面,您的代码几乎立即执行,因此 i - 1 = 0 - 1 = -1,并且没有列表具有否定位置。不,设置 i = 1 不是解决方案。


如果我正确理解当前代码,您只会得到列表中的最后一个对象...

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

如果这不是预期的结果,那么你有一个完整的 fcmUsers 列表,但只有一个地图信息 window,所以只有如果您使用 i 变量并且您没有为每个对象设置一个 ,则要设置一个值,这解释了为什么所有值都相同。

您可以使用 position 变量代替 i - 1,或者像 android 中的任何适配器一样,从标记获取当前位置元素的数据提供

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

此外,不要忘记将 if (fcmUsers.size() > 0) 移出 while 循环