【问题标题】:Getting Firebase Listview position获取 Firebase Listview 位置
【发布时间】:2017-11-14 19:43:19
【问题描述】:

我有一个用于填充列表视图的用户类。这是我创建用户节点的方式

        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);

一切正常...直到我想使用从此列表视图中检索到的值。我为listview的长点击项设置了一种获取值的方法,但它不起作用。

@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;
        }

没办法,我可以选择列表视图的任何元素,但我总是得到第一个。任何帮助将不胜感激。

更新:这是我用来获取 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) {
        }
    });

【问题讨论】:

    标签: java android listview firebase firebase-realtime-database


    【解决方案1】:

    要获取用户单击的 ListView 元素的值,您需要使用以下代码行:

    String s = (String) arg0.getItemAtPosition(position);
    Log("TAG", s);
    

    【讨论】:

    • 我必须把它放在“OnLongClickListener”上吗?我可以用字符串 s 做什么?
    • 你想要的一切。它表示用户长时间单击的 ListView 元素的 String 类型的值。是否将对应项的值记录到logcat中?
    • 我明白了。但是列表视图的目标是选择一个用户并通过 ValueEventListener 获取其 Uid 值,并将其存储在 idAdminToAdd 中。很抱歉,问题不是那么清楚。使用我制作的代码,rapresent 的值实际上是 2 Uid,但无论我选择什么元素,我总是只得到其中一个。如果这样做更容易,非我在徘徊:admin_node.push().setValue(s)。
    【解决方案2】:

    嗯,我自己创建的。像往常一样,大多数错误都是糟糕的教程造成的。首先,我想使用上下文操作栏将项目添加到“管理”数据库,同时在同一驯服中添加更多项目。此行为在“setMultiChoiceModeListener()”中进行了描述。

    解决问题的方法是根据“int position”获取适配器上的正确位置,从而从一个包含所有显示项目的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”的值。

    【讨论】:

      猜你喜欢
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2015-05-18
      • 1970-01-01
      相关资源
      最近更新 更多