簡體   English   中英

獲取Firebase Listview位置

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM