如何更新存储在 ArrayList 中的项目? (Android)

How to update an item stored in an ArrayList? (Android)

我正在从 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 上的更改(尤其是纬度和经度)时,标记将不会 redundant/multiply。

我建议使用 map(例如 HashMap)来保存带有 ID 的数据。

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

如果您在其他地方将地图用作列表,您还可以从地图中获取所有值作为列表。

地图方面的一些帮助: Driver 应该是你的类型,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() 映射方法,或类似的方法。

使用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);

            }

您可以使用带有位置和数据参数的 ArrayList class 的 set() 方法来设置 ArrayList 中的值。

set(int index, Element E)

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

那么我从您的代码中了解到,您想要唯一标识应用程序中每个 driver 位置的变化。

所以是的,保留 HashMap 是个好主意,因为您不必担心用于识别特定 driver 位置变化的唯一密钥.

但是,因此,我建议将从您的 Firebase 获取的数据保存在本地 sqlite 数据库文件中,并且每次更新时,您都可以 re-analyze 您的数据来创建再次标记(即刷新标记)。

例如,您可以有三个 table。

  • 一个用于列出所有 drivers(主键 driver_id
  • 您的旅行。 (主键 trip_id 和 Trip table 中的每一行都与一个 driver_id 相关联)
  • 一个用于列出所有游乐设施(此 table 将包含有关每个游乐设施的所有信息以及纬度和经度。您的 firebase 数据库中的每个更新都将在此处有一个条目)

table 可能看起来像

司机table

driver_id - 1
name - Driver 1

driver_id - 2
name - Driver 2

行程 table

trip_id - 1
driver_id - 1

trip_id - 2 
driver_id - 1

trip_id - 3 
driver_id - 2

游乐设施table

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

现在,每次 Firebase 更新本地数据库并为地图中的每个 driver 重新绘制标记时,table 您就可以从 Rides re-analyze 获取数据。

您可以使用简单的 sql 查询来创建 driver 基于 updateTime 走过的路径。根据updateTime对路径点进行排序,并删除任何具有相同经度和纬度的连续数据。

希望对您有所帮助。