2017-11-14 9 views
0

私はリストビューを設定するためのUserクラスを持っています。これは私がこのリストビューから取得した値で作業したいまで、すべてが...良い作品ユーザーノードFirebaseのリストビューの位置を取得する

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

Node Image

を作成する方法です。値を取得するために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; 
     } 

私はリストビューの要素を選択することはできますが、常に最初のものを取得します。どんな助けもありがとう。

更新:ユーザーが次のコード行を使用する必要がクリックした上で、リストビューの要素の値を取得するには

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

答えて

0

:これは私がidAdminToAdd値を取得するために使用するリスナーです。

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

私はこれを "OnLongClickListener"に入れなければなりませんか?そして、私は文字列sで何ができますか? –

+0

あなたが望むものすべて。これは、ユーザーが長いクリックをしたListView要素のString型の値を表します。 logcatに対応する項目の値を記録しますか? –

+0

私は参照してください。しかし、リストビューの目的は、1人のユーザーを選択し、そのUid値をValueEventListenerに取り込み、idAdminToAddに格納することです。私の質問ではあまり明確ではないことを申し訳ありません。私が作ったコードでは、値は本当に2 Uidですが、私が選んだ要素は常に1つだけです。これを行う方が簡単な場合は、私は気にしません:admin_node.push()。setValue(s)。 –

0

私は自分でそれを創設しました。いつものように、エラーの大半は悪いチュートリアルの結果でした。まず最初に、コンテキスト・アクション・バーを使用して「Admin」データベースにアイテムを追加し、同じ時間内にアイテムを追加したいと考えました。この動作は、「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)); 
        } 
       } 
      }); 

ご覧のとおり、最初のiはadminList配列内のすべての項目を追加し、「selectedPosition」から与えられたインデックスに含まれる要素を「管理者」の値をsetted。

関連する問題