如何更新存储在 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 更新项目
如何在 AsyncTask 中更新 ArrayList 的内容?