如何从android中的firebase中检索List对象

Jun*_*rsi 25 android arraylist firebase firebase-realtime-database

我无法从Firebase中检索列表.我可以毫无困难地存储它,但是当我尝试将dataSnapshot.getValue()强制转换为ArrayList时,我的应用程序崩溃了,给出了异常:

HashMap无法转换为ArrayList

但是当我试图将它转换为HashMap时,它也会崩溃,给出异常:

ArrayList无法转换为hashmap

需要帮助!以下是创建问题的代码:

Fire.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<TaskDes> td = (ArrayList<TaskDes>) dataSnapshot.getValue()
        notifyDataSetChanged();
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {

    }
});
Run Code Online (Sandbox Code Playgroud)

firebase对象屏幕截图

我想将Firebase中的所有数据检索为一个列表.TaskDes类包含三个字段:

class TaskDes { // definition
    boolean done
    String taskDescription
    String taskTitle
}
Run Code Online (Sandbox Code Playgroud)

小智 42

您需要创建一个GenericTypeIndicator对象作为DataSnapshot.getValue()参数传递.

码:

GenericTypeIndicator<List<String>> t = new GenericTypeIndicator<List<String>>() {};

List<String> yourStringArray = dataSnapshot.getValue(t);
Run Code Online (Sandbox Code Playgroud)

  • 如果列表在另一个对象中怎么办? (9认同)
  • @GregEnnis我发现了怎么做.`GenericTypeIndicator <MyModel> t = new GenericTypeIndicator <MyModel>(){};`就像那样.在我的`MyModel`里面,我有一个`List`和其他字段. (2认同)

Muh*_*eed 9

你的模特

public class TaskDes {
    private boolean done;
    private String taskDescription;
    private String taskTitle;

    public TaskDes() {
    }

    public boolean isDone() {
        return done;
    }

    public void setDone(boolean done) {
        this.done = done;
    }

    public String getTaskDescription() {
        return taskDescription;
    }

    public void setTaskDescription(String taskDescription) {
        this.taskDescription = taskDescription;
    }

    public String getTaskTitle() {
        return taskTitle;
    }

    public void setTaskTitle(String taskTitle) {
        this.taskTitle = taskTitle;
    }

}
Run Code Online (Sandbox Code Playgroud)

您需要创建一个GenericTypeIndicator对象作为DataSnapshot.getValue()参数传递.

在活动中

 private static final String TAG=MainActivity.class.getSimpleName();
 private FirebaseDatabase database;
 private DatabaseReference myRef=null;

 @Override
 protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    database=FirebaseDatabase.getInstance();
    myRef=database.getReference("ADD_YOUR_REFERECE");


    myRef.addValueEventListener(new ValueEventListener(){
       @Override
       public void onDataChange(DataSnapshot dataSnapshot){
          /* This method is called once with the initial value and again whenever data at this location is updated.*/
          long value=dataSnapshot.getChildrenCount();
          Log.d(TAG,"no of children: "+value);

          GenericTypeIndicator<List<TaskDes>> genericTypeIndicator =new GenericTypeIndicator<List<TaskDes>>(){};

          List<TaskDes> taskDesList=dataSnapshot.getValue(genericTypeIndicator);

          for(int i=0;i<taskDesList.size();i++){
             Toast.makeText(MainActivity.this,"TaskTitle = "+taskDesList.get(i).getTaskTitle(),Toast.LENGTH_LONG).show();
          }
       }

       @Override
       public void onCancelled(DatabaseError error){
          // Failed to read value
          Log.w(TAG,"Failed to read value.",error.toException());
       }
    });
 }
Run Code Online (Sandbox Code Playgroud)