[英]Getting Firebase Listview position
我有一個User類用於填充listview。 這是我創建用戶節點的方式
currentUser= FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference usersDatabase= FirebaseDatabase.getInstance().getReference("Users");
usersDatabase.keepSynced(true);
User users= new User(FirebaseAuth.getInstance().getCurrentUser().getDisplayName());
String key = currentUser;
usersDatabase.child(key).setValue(users);
一切正常...直到我想使用從此列表視圖檢索的值。 我為長按列表項的項目設置了一種獲取值的方法,但是它不起作用。
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position,
long id, boolean checked) {
adminToAdd = new ArrayList<>();
if (checked) {
adminToAdd.add(uAdapter.getItem(position));
} else {
adminToAdd.remove(uAdapter.getItem(position));
}
uAdapter.notifyDataSetChanged();
int checkedItems = listView.getCheckedItemCount();
if (checkedItems==1){
mode.setTitle(String.valueOf(checkedItems) + getString(R.string.selected));
} else {
mode.setTitle(String.valueOf(checkedItems) + getString(R.string.more_selected));
}
}
});
uAdapter= new UsersAdapter(this, User.class, R.layout.one_user, FirebaseDatabase.getInstance().getReference("Users"));
listView.setAdapter(uAdapter);
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
selectedPosition = position;
final ListView list = (ListView) arg0;
list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
list.setItemChecked(position, true);
return true;
}
});
我以為使用此代碼,我可以為adminToAdd ArrayList的每個值取值。 然后,我用它來設置另一個名為“ Admins”的數據庫子級。 方式:
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem menuItem) {
// TODO Auto-generated method stub
switch (menuItem.getItemId()) {
case R.id.menu_admin_add:
for (User newAdmin : adminToAdd) {
DatabaseReference admin_node= FirebaseDatabase.getInstance().getReference().getRoot().child("Admins");
admin_node.push().setValue(idAdminToAdd);
Toast.makeText(UsersList.this,getString(R.string.admin_added),Toast.LENGTH_LONG).show();
}
uAdapter.notifyDataSetChanged();
mode.finish();
}
return false;
}
沒辦法,我可以選擇listview的任何元素,但是我總是第一個。 任何幫助將不勝感激。
更新:這是我用來獲取idAdminToAdd值的偵聽器:
DatabaseReference adminDatabase = FirebaseDatabase.getInstance().getReference().getRoot().child("Users");
adminDatabase.addListenerForSingleValueEvent(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
idAdminToAdd = childSnapshot.getKey();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
要獲取用戶單擊的ListView元素的值,您需要使用以下代碼行:
String s = (String) arg0.getItemAtPosition(position);
Log("TAG", s);
好吧,我是自己創建的。 像往常一樣,大多數錯誤是教程不當的結果。 首先,我想使用上下文操作欄將項目添加到“管理員”數據庫中,同時在同一馴服中添加更多項目。 在“ setMultiChoiceModeListener()”中描述了此行為。
該問題的解決方案是基於“ int位置”獲得適配器上的正確位置,並因此從包含所有顯示項的ArrayList中獲得相應的索引。
碼:
final ArrayList<String> adminList = new ArrayList<>();
DatabaseReference adminRef = FirebaseDatabase.getInstance().getReference("Users");
adminRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot users : dataSnapshot.getChildren()) {
adminList.add(users.getKey());
}
listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
// TODO Auto-generated method stub
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// TODO Auto-generated method stub
getMenuInflater().inflate(R.menu.admin_activity_menu, menu);
return true;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem menuItem) {
// TODO Auto-generated method stub
switch (menuItem.getItemId()) {
case R.id.menu_admin_add:
DatabaseReference admin_node= FirebaseDatabase.getInstance().getReference().getRoot().child("Admins");
admin_node.push().setValue(adminList.get(selectedPosition));
Toast.makeText(UsersList.this,getString(R.string.admin_added),Toast.LENGTH_LONG).show();
uAdapter.notifyDataSetChanged();
mode.finish();
}
return false;
}
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position,
long id, boolean checked) {
selectedPosition = position;
uAdapter.notifyDataSetChanged();
int checkedItems = listView.getCheckedItemCount();
if (checkedItems==1){
mode.setTitle(String.valueOf(checkedItems) +" "+ getString(R.string.selected));
} else {
mode.setTitle(String.valueOf(checkedItems) +" "+ getString(R.string.more_selected));
}
}
});
如您所見,首先我將所有項目添加到adminList數組中,然后使用“ selectedPosition”給出的索引中包含的元素設置“ Admin”的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.