简体   繁体   中英

Firebase UI 3.0.0: Retrieve data to recycle view

Can anyone help me to retrieve data from the node "foods" and put it in the RecyclerView . These are the file I've been working on but it turns out to be an empty list. I have viewed a tutorial on Internet but most of them were with an older version of Firebase. Recently, Firebase UI has been updated and the data binding process has changed to their new FirebaseRecyclerAdapter structure

This is my database structure:

"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"
},

This is my activity:

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

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

The query specified in the setQuery() method should be a reference to the root of the list you want to show in the RecyclerView , so like this:

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

You also need to call startListening() on the adapter to instruct it to start retrieving data from the database.

From the FirebaseRecyclerAdapter lifecycle documentation :

The FirebaseRecyclerAdapter uses an event listener to monitor changes to the Firebase query. To begin listening for data, call the startListening() method. You may want to call this in your onStart() method. Make sure you have finished any authentication necessary to read the data before calling startListening() or your query will fail.

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

Similarly, the stopListening() call removes the event listener and all data in the adapter. Call this method when the containing Activity or Fragment stops:

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

This is how I'm retrieving my data in recyclerview using 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);
    }

this is my firebase structure :

Firebase中的结构

hope this will help you.

Please override getItemCount() method of FirebaseRecyclerAdapter .

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

Reference.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM