【问题标题】:How to update an item stored in an ArrayList? (Android)如何更新存储在 ArrayList 中的项目? (安卓)
【发布时间】:2017-02-07 10:48:10
【问题描述】:

我正在从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(尤其是纬度和经度)发生变化时,标记就不会冗余/成倍增加。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    例如,您可以拥有三个表。

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

    表格可能看起来像

    驱动程序表

    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
    

    现在,您可以在每次 Firebase 更新本地数据库时重新分析 Rides 表中的数据,并为地图中的每个司机重新绘制标记。

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

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 查看代码。如果您不知道列表中项目的位置。首先创建通用标签(如 pojo 类中的 ID)。搜索该 ID 并替换您的数据。
      【解决方案3】:

      我建议使用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() 方法的 map 或类似的东西。

      【讨论】:

      • 但是如何处理HashMap。可以给点sn-ps吗?
      • 嗯,HashMap 是一个非常普遍和基本的编程概念,所以你应该找到很多关于它的资料。找到一些想法here,我会尝试添加一些sn-p,但是我还没有使用firebase。
      • 啊好吧!谢谢。我还没试过。我稍后会反馈你:)
      【解决方案4】:

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

      set(int index, Element E)
      

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

      【讨论】:

      • 不知道物品的位置怎么办?大佬有什么办法吗?
      • 这样你需要在列表中进行搜索,恕我直言,地图方式更容易一些。
      • 如果你有更多的替换操作,并且不需要维护插入顺序,那么你可以去HashMap。
      猜你喜欢
      • 2012-08-29
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2012-03-21
      • 2016-06-18
      • 2017-12-21
      相关资源
      最近更新 更多