如何更新存储在ArrayList中的项目? (机器人)

时间:2016-09-29 08:06:28

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

我从Firebase获取数据,在获取假定数据后,我将其存储在ArrayList上。所以这是示例代码。

markerArray = new ArrayList<>();
Firebase ref = new Firebase(Config.FIREBASE_URL_DRIVER);
ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.getChildrenCount() == 0) {
            markerInfo();
        } else {
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                name = snapshot.child("driversName").getValue().toString().trim();
                busNum = snapshot.child("busNum").getValue().toString().trim();
                latitude = Double.valueOf(snapshot.child("latitude").getValue().toString().trim());
                longitude = Double.valueOf(snapshot.child("longitude").getValue().toString().trim());
                availableSeat = snapshot.child("availableSeat").getValue().toString().trim();
                estimatedTime = snapshot.child("estimatedTime").getValue().toString().trim();
                if ((!latitude.equals(null) || latitude.equals(0)) && (!longitude.equals(null) || longitude.equals(0)) && availableSeat.equals("") && (!estimatedTime.equals("") || estimatedTime.equals("0"))) {
                    convertLatLong();
                    getTotalPass();
                    Toast.makeText(MainMapActivity.this, currentLocation+" :currentLocation", Toast.LENGTH_SHORT).show();
                    markerArray.add(new Driver(name, totalPassenger, busNum, latitude, longitude, currentLocation, estimatedTime));
                }
            }
            Toast.makeText(MainMapActivity.this, "markerArraySize: "+markerArray.size(), Toast.LENGTH_SHORT).show();
            for (i = 0; i < markerArray.size(); i++) {
                createMarker(markerArray.get(i).getDriversName(), markerArray.get(i).getTotalPassenger(), markerArray.get(i).getBusNum(), markerArray.get(i).getLatitude(), markerArray.get(i).getLongitude(), markerArray   .get(i).getLocation(), markerArray.get(i).getEstimatedTime());
            }
        }
    }
}

我想更新我的ArrayList,这样只要Firebase上的更改(特别是纬度和经度)被提取,标记就不会是冗余/多重。

4 个答案:

答案 0 :(得分:5)

因此,我从您的代码中了解到,您希望唯一地标识应用程序中每个驱动程序位置的更改。

所以是的,保留HashMap是一个不错的主意,因为您不必担心用于识别特定驱动程序的位置更改的唯一键。

但是,因此,我建议将Firebase中的数据提取保存在本地sqlite数据库文件中,每次更新时,您都可以重新分析数据以再次创建标记(即刷新标记) 。

例如,您可以有三个表。

  • 一个用于列出所有驱动程序(主键driver_id
  • 你正在旅行。 (主键trip_id和Trip表中的每一行都与driver_id
  • 相关联
  • 一个用于列出所有游乐设施(此表格将包含有关每次游览的所有信息以及纬度和经度。您的火力库数据库中的每个更新都将在此处输入一个条目)

表可能看起来像

驱动程序表

driver_id - 1
name - Driver 1

driver_id - 2
name - Driver 2

旅行表

trip_id - 1
driver_id - 1

trip_id - 2 
driver_id - 1

trip_id - 3 
driver_id - 2

骑表

trip_id - 1
driver_id - 1 
longitude - 9.4
latitude - 38
updateTime - 78783232

trip_id - 1
driver_id - 1 
longitude - 5.8
latitude - 53
updateTime - 78783242

trip_id - 1
driver_id - 1 
longitude - 78
latitude - 56
updateTime - 78783252

trip_id - 2
driver_id - 1 
longitude - 8
latitude - 77
updateTime - 78783262

现在,从Rides表中,每次Firebase更新本地数据库并重新绘制地图中每个驱动程序的标记时,都会重新分析数据。

您可以使用简单的SQL查询来根据updateTime创建驱动程序所经历的路径。根据{{​​1}}对路径点进行排序,并删除具有相同经度和纬度的所有连续数据。

希望有所帮助。

答案 1 :(得分:1)

我建议您使用mapHashMap例如)来保存您的数据。

然后,稍后当发生更改时,您可以搜索id,是否已存储在地图中,并更改相应密钥的值。

如果您在地图中将其用作列表,也可以将地图中的所有值作为列表获取。

地图的一些帮助: 驱动程序应该是您的类型,String可以是键的类型,如busNum或名称。 创建地图:

Map<String, Driver> markersMap = new HashMap<String, Driver>();

通过检查值来设置值:

Driver driver = new Driver(name, totalPassenger, busNum, latitude, longitude, currentLocation, estimatedTime);
// that's how you check if there's already a value
markersMap.containsKey(name); 
// A put overwrites the value anyway, so maybe you don't need the check
markersMap.put(name, driver)

同样,为了将值作为列表获取,应该有values()方法的地图,或类似的东西。

答案 2 :(得分:1)

使用arraylist的set(position,data)方法来消耗你的需求。

 ArrayList<String> alstr = new ArrayList<>();
            alstr.add("khan");
            alstr.add("yogesh");
            alstr.add("kapil");
            alstr.add("rajoria");

            for(String str : alstr) {
                System.out.println(str);
            }
            // update value here
            alstr.set(3, "Ramveer");
            System.out.println("with Iterator");
            Iterator<String> itr = alstr.iterator();

            while (itr.hasNext()) {
                Object obj = itr.next();
                System.out.println(obj);

            }

答案 3 :(得分:0)

您可以使用带有position和data参数的ArrayList类的set()方法来设置ArrayList中的值。

set(int index, Element E)

但只有当您知道需要更改项目的位置时,这才会帮助您。