Android Firebase无法将java.util.HashMap类型的值转换为String

时间:2018-02-19 14:56:02

标签: android firebase firebase-realtime-database

我尝试在我的片段上使用数组适配器使用listview但是当尝试使用教程时,每次打开该特定片段时它都会崩溃。我试图将我的firebase上的数据显示到listview中,但每次打开它时它都会崩溃。

这是我的数据库 enter image description here

从图片中我的计划是仅显示用户的电子邮件和姓名,不包括类型,但我稍后会这样做。

这是我的代码

public class memberFragment extends Fragment {
private ListView mylistView;
private DatabaseReference mDatabase;
ArrayList<String> myArrayList = new ArrayList<>();
FirebaseDatabase myFirebase;


public memberFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_member2, container, false);
    mDatabase = FirebaseDatabase.getInstance().getReference().child("Accounts").child("Users");
    final ArrayAdapter<String> myArrayAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,myArrayList);
     mylistView = (ListView)view.findViewById(R.id.listView);
     mylistView.setAdapter(myArrayAdapter);


    mDatabase.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            String myChildValues = dataSnapshot.getValue(String.class);
            myArrayList.add(myChildValues);
            myArrayAdapter.notifyDataSetChanged();


        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            myArrayAdapter.notifyDataSetChanged();

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    // Inflate the layout for this fragment
    return view;

任何可能导致问题的想法?我试图搜索并发现它与hashmap或map相关,但我不知道如何将它放在我的数组上?

3 个答案:

答案 0 :(得分:3)

如果要从参考数据快照而不是dataSnapshot.getValue(String.class);获取所有值,则应创建包含这些字段的数据类。举个例子:

public class UserData {
    private String name;
    private String email;
    private Integer type;

    public UserData() {}

    public UserData(String name, String email, Integer type) {
        this.name = name;
        this.email = email;
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getType() {
        return type;
    }

    public void setType(Integer type) {
        this.type = type;
    }
}  

然后使用这个类,您可以像这样使用它来获取用户的所有数据:
UserData data = (UserData) dataSnapshot.getValue(UserData.class);
通过使用getter,您可以获得所需的值。

答案 1 :(得分:3)

可以使用模型类来实现此目的,或者您可以使用String类使用最简单的方法。为此,您可以使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("Accounts").child("Users");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String email = ds.child("email").getValue(String.class);
            String name = ds.child("name").getValue(String.class);
            Log.d("TAG", email + " / " + name);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
usersRef.addListenerForSingleValueEvent(eventListener);

您的输出将是:

a@b.com / idk
//and so on

答案 2 :(得分:0)

更简单的方法是为要从Firebase检索的列表项创建对象,然后使用该对象设置列表视图项。 但是如果您使用的是简单的列表适配器,那么我建议您进行以下更改:

mDatabase.addValueEventListener(new ValueEventListener {
   @Override
      public void onDataChange(DataSnapshot dataSnapshot){
            for (DataSnapshot snapshot : dataSnapshot.getChildren()){
               String myChildValues = snapshot.getvalue(String.class);
               myArrayList.add(myChildValues);
               myArrayAdapter.notifyDataSetChange();
               }
       }

       @Override
         public void onCancelled(DatabaseError databaseError) {

        }
    });

对“Users”下的每个字符串数据执行相应操作。