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

Posted

技术标签:

【中文标题】如何更新存储在 ArrayList 中的项目? (安卓)【英文标题】:How to update an item stored in an ArrayList? (Android) 【发布时间】: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(尤其是纬度和经度)发生变化时,标记就不会冗余/成倍增加。

【问题讨论】:

【参考方案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。

以上是关于如何更新存储在 ArrayList 中的项目? (安卓)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用过滤的 RecyclerView 和 OnClickListener 从 ArrayList 中删除项目

如何从 Android 中 ArrayAdapter 上的 ArrayList 更新项目

ArrayList 中的项目重复

如何在 AsyncTask 中更新 ArrayList 的内容?

通过 RMI 发送存储在 ArrayList 中的数据 [关闭]

如何从服务器下载图像如果使用Asynctask存储在ArrayList中的URL?