我尝试在我的片段上使用数组适配器使用listview但是当尝试使用教程时,每次打开该特定片段时它都会崩溃。我试图将我的firebase上的数据显示到listview中,但每次打开它时它都会崩溃。
从图片中我的计划是仅显示用户的电子邮件和姓名,不包括类型,但我稍后会这样做。
这是我的代码
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相关,但我不知道如何将它放在我的数组上?
答案 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”下的每个字符串数据执行相应操作。