我正在使用listview和arrayadapter,我正在使用 simple_list_item_multiple_choice ,因此我可以在listview中选择多个项目。
我想做什么:我希望所有选定的项目都插入到我的Firebase数据库中。为此,我使用的是hashmap。
我做了什么:
addUsersButton.setOnClickListener(new View.OnClickListener() {
HashMap<String, Object> drivers = new HashMap<>();
@Override
public void onClick(View v) {
int cntChoice = userList.getCount();
SparseBooleanArray sparseBooleanArray = userList.getCheckedItemPositions();
for (int i = 0; i < cntChoice; i++) {
if (sparseBooleanArray.get(i)) {
drivers.put("drivers", userList.getItemAtPosition(i).toString());
}
}
userRef.child(sharedPreferences.getString("school", null)).child("routes").child(key).updateChildren(drivers);
}
});
问题:这只会将其中一个选定项添加到数据库中。我不知道为什么。
答案 0 :(得分:1)
对于所选项目的每次迭代,您都在调用:
drivers.put("drivers", userList.getItemAtPosition(i).toString());
哪个会覆盖"drivers"
中HashMap
的{{1}}值与指定位置的项目,因此您的HashMap
只包含一个关键字为"drivers"
的项目。这是因为HashMap
keys are unique and calling put()
replaces the previous value associated with the given key if it already exists。
因此,您需要使用唯一ID将每个项目添加到HashMap
,然后在updateChildren()
子节点上调用drivers
:
addUsersButton.setOnClickListener(new View.OnClickListener() {
HashMap<String, Object> drivers = new HashMap<>();
@Override
public void onClick(View v) {
int cntChoice = userList.getCount();
SparseBooleanArray sparseBooleanArray = userList.getCheckedItemPositions();
for (int i = 0; i < cntChoice; i++) {
if (sparseBooleanArray.get(i)) {
String uniqueId = usersRef.push().getKey(); // this doesn't actually push any data to the database
drivers.put(uniqueId, userList.getItemAtPosition(i).toString()); // use the unique ID to add to the HashMap
}
}
userRef.child(sharedPreferences.getString("school", null))
.child("routes")
.child(key)
.child("drivers") // specify "drivers" child node here
.updateChildren(drivers);
}
});
这样,每个项目都会添加到具有唯一ID的HashMap
,然后此HashMap
会被推送到drivers
子节点。