【问题标题】:getting data from firebase but face Index error从 firebase 获取数据但面临索引错误
【发布时间】:2017-10-28 07:22:00
【问题描述】:

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

我用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;

        }

    });

【问题讨论】:

    标签: android firebase-realtime-database google-maps-markers indexof android-maps


    【解决方案1】:

    我用0初始化顶部i的值

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

    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 列表,但只有一个地图信息窗口,因此如果您使用 i,则只需设置一个值变量,并且您没有为每个对象设置一个,这就解释了为什么所有值都相同。

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

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

    另外,不要忘记将 if (fcmUsers.size() &gt; 0) 移到 while 循环之外

    【讨论】:

    • 不,我不想从列表中获取最后一个对象,我希望当用户单击标记时,它会显示标记的电池(来自 fcUsers 列表)它是一个跟踪应用程序
    • 每个标记都有单独的值,我只想在标记上显示
    • 您在添加标记时已经使用了MarkerOptions().title(fcmUsers.get(i),那么为什么您认为需要从用户列表中再次获取它?
    • 想设置userbattery.setText(String.valueOf(last.Battery));具有来自 fcmUser 的有效索引
    • 您是否尝试使用arg0.getTitle()
    猜你喜欢
    • 2021-05-19
    • 1970-01-01
    • 2017-11-27
    • 2013-04-18
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    相关资源
    最近更新 更多