2015-06-09 5 views
14

Ho problemi a recuperare un elenco dal Firebase. Non ho problemi a riporlo, ma non appena provo a lanciare dataSnapshot.getValue() per ArrayList miei applicazione si blocca, dando un'eccezione:Come recuperare un oggetto List dal firebase in Android

HashMap non può essere colato a ArrayList

Ma quando ho provato a lanciarlo a un HashMap, si blocca anche, dando eccezione:

ArrayList non può essere colato a hashmap

Hai bisogno di aiuto per favore! Ecco il codice che sta creando il problema:

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

Voglio recuperare tutti i dati nel Firebase come una lista. I TaskDes classe contiene tre campi:

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

Purtroppo non c'è abbastanza qui il codice per me aiutare tu risolvi. Il lato positivo: l'app di esempio di AndroidChat di Firebase fa tutto ciò che stai cercando e poco altro. Dai un'occhiata qui: https://github.com/firebase/AndroidChat/tree/master/app/src/main/java/com/firebase/androidchat. Di recente ho spiegato un po 'dei suoi interni sul Firebase Google Group: https://groups.google.com/d/msg/firebase-talk/OCoQPvpgl1U/Nli_OywG7LYJ –

+0

Grazie, ci provo, un'altra cosa che voglio chiedere se immagazzino la hashmap sulla base di fuoco, quindi quando la richiamo dal firebase posso lanciare direttamente il datasnapshot.getValue() in hashmap ?? –

+0

Sì, è possibile. Ma solo se modellate correttamente la classe 'Task'. Dai un'occhiata all'esempio. Il tuo 'compito' dovrebbe apparire come https://github.com/firebase/AndroidChat/blob/master/app/src/main/java/com/firebase/androidchat/Chat.java –

risposta

25

È necessario creare un oggetto GenericTypeIndicator da passare come DataSnapshot.getValue() parametro.

Codice:

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

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

Cosa fare se l'elenco si trova all'interno di un altro oggetto? –

+0

@GregEnnis Hai capito come risolverlo se la lista si trova all'interno di un altro oggetto? – malhobayyeb

+0

@malhobayyeb nope non ho mai trovato un buon modo per farlo –

6

il modello

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

} 

È necessario creare un oggetto GenericTypeIndicator da passare come DataSnapshot.getValue() parametro.

In attività

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

un po 'tardi, ma nel caso in cui nessun altro ha bisogno di questo.

SE l'elenco si trova all'interno di un altro oggetto.

L'oggetto

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

Quindi per ottenere la vostra serie di domande oggetti

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

fare un altro elemento che contiene un elenco per il tuo articolo: questo è il vostro articolo:

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

Questa è la voce di elenco

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

     public TaskDesList(){ 
     } 

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

e quando si chiama un EventListener

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

e ora "yourlist" è un elenco che contiene tutti i tuoi "TaskDes" elementi