2017-10-18 3 views
1

Quelqu'un peut-il m'aider à récupérer des données du noeud "aliments" et le mettre dans le RecyclerView. C'est le fichier sur lequel j'ai travaillé, mais il s'avère que c'est une liste vide. J'ai vu un tutoriel sur Internet mais la plupart d'entre eux étaient avec une ancienne version de Firebase. Récemment, l'interface utilisateur Firebase a été mis à jour et le processus de liaison de données a changé à leur nouvelle structure FirebaseRecyclerAdapterFirebase UI 3.0.0: Récupérer les données à recycler vue

Ceci est ma structure de base de données:

"foods" : { 
"AntipastoSalad" : { 
    "duration" : "30", 
    "img" : "https://firebasestorage.googleapis.com/v0/b/mealplanner-ec8ca.appspot.com/o/res%2Fsalad.jpg?alt=media&token=257d4392-8a1f-4fb7-84b5-b63abb4643f4", 
    "name" : "Antipasto salad", 
    "type" : "Salad" 
}, 

Ceci est mon activité:

private RecyclerView mRecycleView; 
    private Query query; 
    private FirebaseRecyclerOptions<Meal> options; 
    private DatabaseReference mDatabase; 

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

     mDatabase = FirebaseDatabase.getInstance().getReference().child("foods"); 

     //Recycle View 
     mRecycleView = (RecyclerView) findViewById(R.id.meal_items); 
     mRecycleView.setHasFixedSize(true); 
     mRecycleView.setLayoutManager(new LinearLayoutManager(this)); 
    } 


    @Override 
    protected void onStart() { 
     super.onStart(); 

     query = FirebaseDatabase.getInstance().getReferenceFromUrl("https://mealplanner-ec8ca.firebaseio.com/foods/AntipastoSalad"); 

     options = new FirebaseRecyclerOptions.Builder<Meal>() 
       .setQuery(query, Meal.class) 
       .build(); 

     FirebaseRecyclerAdapter<Meal, FoodListRowActivity.MealRowHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Meal, FoodListRowActivity.MealRowHolder>(
       options) { 
      @Override 
      public FoodListRowActivity.MealRowHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
       View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.food_row, parent, false); 
       return new FoodListRowActivity.MealRowHolder(v); 
      } 

      @Override 
      protected void onBindViewHolder(FoodListRowActivity.MealRowHolder holder, int position, Meal current) { 
       holder.setTitle(current.getName()); 
       String duration = current.getDuration() + "min"; 
       holder.setDuration(duration); 
      } 
     }; 

     //Populate Item into Adapter 
     mRecycleView.setAdapter(firebaseRecyclerAdapter); 

     mRecycleView.addOnItemTouchListener(new RecycleViewItemClickListener(this, mRecycleView, new RecycleViewItemClickListener.OnItemClickListener() { 
      @Override 
      public void onItemClick(View view, int position) { 
       Intent viewMeal = new Intent(FoodListRowActivity.this, CookingInstructionActivity.class); 
       startActivity(viewMeal); 
      } 

      @Override 
      public void onLongItemClick(View view, int position) { 
       //TODO: DELETE 
      } 
     })); 
    } 

    public static class MealRowHolder extends RecyclerView.ViewHolder { 

     View mView; 

     public MealRowHolder(View itemView) { 
      super(itemView); 
      mView = itemView; 

     } 

     public void setTitle(String title) { 
      TextView foodTitle = (TextView) mView.findViewById(R.id.list_item_foodList_name); 
      foodTitle.setText(title); 
     } 


     public void setDuration(String title) { 
      TextView foodDuration = (TextView) mView.findViewById(R.id.list_item_foodList_calories); 
      foodDuration.setText(title); 
     } 
    } 
} 

et classe structure:

public class Meal{ 

private String img; 
private String duration; 
private String name; 
private String instruction; 

public Meal(){ 

} 

public Meal (String img, String duration, String name, String instruction){ 
    this.img = img; 
    this.name = name; 
    this.duration = duration; 
    this.instruction = instruction; 
} 

public void update(String duration, String name, String instruction) 
{ 
    this.name = name; 
    this.duration = duration; 
    this.instruction = instruction; 
} 
public String getName(){ 
    return name; 
} 

public String getDuration() { 
    return duration; 
} 

public String getInstruction() { 
    return instruction; 
} 

public String getImg(){return img;} 

Répondre

3

Le query spécifié dans la méthode setQuery() doit être une référence à la racine de la liste que vous voulez afficher dans le RecyclerView, donc comme ceci:

query = FirebaseDatabase.getInstance().getReference().child("foods"); 

Vous aussi besoin d'appeler startListening() sur l'adaptateur pour lui demander de commencer à récupérer des données de la base de données.

De l'FirebaseRecyclerAdapter lifecycle documentation:

Le FirebaseRecyclerAdapter utilise un écouteur d'événements pour surveiller les changements à la requête Firebase. Pour commencer à écouter les données, appelez la méthode startListening(). Vous pouvez appeler cela dans votre méthode onStart(). Assurez-vous que vous avez terminé toute authentification nécessaire pour lire les données avant d'appeler le startListening() ou votre requête échouera.

@Override protected void onStart() { 
    super.onStart(); 
    adapter.startListening(); 
} 

De même, l'appel stopListening() supprime l'écouteur d'événement et toutes les données de l'adaptateur. Appelez cette méthode lorsque les contenant Activity ou Fragment arrêts:.

@Override protected void onStop() { 
    super.onStop(); 
    adapter.stopListening(); 
} 
0

Voilà comment je récupère mon da ta à l'aide recyclerview Firebase UI:

private FirebaseRecyclerAdapter<TaskPOJO, TaskViewHolder> adapter; 
private void loadTasks() { 


     database = FirebaseDatabase.getInstance(); 
     tasks = database.getReference("Tasks"); 
     adapter = new FirebaseRecyclerAdapter<TaskPOJO, TaskViewHolder>(TaskPOJO.class, R.layout.task_item, TaskViewHolder.class, tasks) { 
      @Override 
      protected void populateViewHolder(TaskViewHolder viewHolder, final TaskPOJO model, int position) { 


       Log.wtf("valueTEst", "populateViewHolder: "+model.toString()); 
       Log.wtf("TEstScript1", "populateViewHolder: "+model.getTitle()); 
       viewHolder.title.setText(model.getTitle()); 
       viewHolder.desc.setText(model.getDescripttion()+"\n"); 
       viewHolder.remaining.setText(model.getRemaining()+"/"+model.getPoint()); 
       viewHolder.points.setText("Points "+model.getRemaining()); 
       Glide.with(viewHolder.title.getContext()) 
         .load(model.getImage()) 
         .into(viewHolder.image); 


       viewHolder.setClickListener(new ItemClickListener() { 
        @Override 
        public void onClick(View view, int position, boolean isLongClick) { 
         Toast.makeText(getActivity(), "" /*+ model.getTitle()*/, Toast.LENGTH_SHORT).show(); 

         Intent TaskPOJODetail = new Intent(getActivity(), Main.class); 
         TaskPOJODetail.putExtra("value","detail"); 
         TaskPOJODetail.putExtra("taskId",adapter.getRef(position).getKey()); 
         startActivity(TaskPOJODetail); 
        } 
       }); 
      } 
     }; 
     progressBar.setVisibility(View.GONE); 
     recyclerViewTasks.setAdapter(adapter); 
    } 

ceci est ma structure firebase:

structure in firebase

espère que cela vous aidera.

+0

Merci pour votre réponse, mais il semble que ce fut l'ancienne version de l'interface utilisateur Firebase :( – hjhk19

0

Remplacez la méthode getItemCount() par FirebaseRecyclerAdapter.

@Override 
    public int getItemCount() { 
     return 1; 
    } 

Reference.

+0

Il est semble que ce problème était pas l'application juste plantage et imprimer java.lang.IndexOutOfBoundsException: L'index 0 est invalide, la taille est 0. Mais merci pour votre aide. – hjhk19