2015-06-09 54 views
14

我無法從Firebase中檢索列表。我有麻煩保存它,但只要我嘗試投dataSnapshot.getValue()到ArrayList的我的應用程序崩潰,從而異常:如何從Android的Firebase中檢索列表對象

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

    } 
}); 

firebase object screen shot

。該類TaskDes包含三個字段:

class TaskDes { // definition 
    boolean done 
    String taskDescription 
    String taskTitle 
} 
+0

列表不幸的是沒有足夠的代碼在這裏對我幫助您排除故障。積極的一面:Firebase的AndroidChat示例應用程序可以完成您正在尋找的所有功能以及更多功能。看看它在這裏:https://github.com/firebase/AndroidChat/tree/master/app/src/main/java/com/firebase/androidchat。我最近在Firebase Google羣組中解釋了一些內部消息:https://groups.google.com/d/msg/firebase-talk/OCoQPvpgl1U/Nli_OywG7LYJ –

+0

謝謝我會試一試,另外一件事我想問一下如果我將hashmap 存儲在firebase上,那麼當從firebase中檢索它時,我可以直接將datasnapshot.getValue()轉換爲hashmap ?? –

+0

是的,那是可能的。但只有在你正確模擬Task類的時候。看看這個例子。你的'Task'應該看起來像https://github.com/firebase/AndroidChat/blob/master/app/src/main/java/com/firebase/androidchat/Chat.java –

回答

25

你需要創建一個GenericTypeIndicator對象傳遞的參數DataSnapshot.getValue()

代碼:

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

List<String> yourStringArray = dataSnapshot.getValue(t); 
+9

如果列表在另一個對象內呢? –

+0

@GregEnnis你知道如何解決它,如果列表是在另一個對象內? – malhobayyeb

+0

@malhobayyeb nope從來沒有找到一個好辦法做 –

6

模型

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

} 

你需要創建一個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()); 
     } 
    }); 
} 
0

有點晚,但在任何情況下,其他人需要這個。

如果列表位於另一個對象內部。

對象

public class Question { 

    public Date date; 
    public String questionNumber; 
    public String questionText; 
    public QuestionType questionType; 
    public String multipleSelection1; 
    public String multipleSelection2; 
    public String multipleSelection3; 

    public Question() { 
     // Default constructor required for calls to DataSnapshot.getValue(User.class) 
    } 
} 

然後讓你的問題的對象數組

GenericTypeIndicator<List<Question>> t = new GenericTypeIndicator<List<Question>>() {}; 
List<Question> questionList = dataSnapshot.getValue(t); 
0

使包含爲您的商品列表中的其他項目: 這是您的項目:

class TaskDes { // definition 
    boolean done 
    String taskDescription 
    String taskTitle 
} 

這是清單項目

 class TaskDesList { // definition 
       private ArreyList<TaskDes> yourlist 
      } 

     public TaskDesList(){ 
     } 

     public ArrayList<TaskDes> getYourlist() { 
      return yourlist; 
     } 

,並調用一個事件監聽時

ref.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       yourlist.clear(); 
      taskDesList=dataSnapshot.getValue(TaskDesList.class); 
       if (taskDesList!=null) { 
        yourlist= taskDesList.getYourlist(); 
       } 
} 

和現在的「yourlist」是包含了所有你的「TaskDes」項目

相關問題