从 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 循环
我想显示用户名,但遇到索引问题。所有标记都显示相同的文本。
我在上面用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 循环