java - 火力地堡用户界面 3.0.0 : Retrieve data to recycle view

标签 java android firebase firebase-realtime-database

谁能帮我从节点“foods”中检索数据并将其放入RecyclerView。这些是我一直在处理的文件,但结果是一个空列表。我在 Internet 上查看了教程,但其中大部分使用的是旧版本的 Firebase。最近,Firebase UI 更新,数据绑定(bind)过程更改为新的 FirebaseRecyclerAdapter 结构

这是我的数据库结构:

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

这是我的 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);
        }
    }
}

和类结构:

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

最佳答案

setQuery() 方法中指定的query 应该是对要在RecyclerView 中显示的列表的根目录的引用,所以像这样:

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

您还需要在适配器上调用 startListening() 以指示它开始从数据库中检索数据。

来自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();
 }

关于java - 火力地堡用户界面 3.0.0 : Retrieve data to recycle view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46806556/

相关文章:

java - 如何处理@Transactional注解引发的异常

java - 谷歌 gson LinkedTreeMap 类转换为 myclass

java - Android:为什么我不能将 setText 与 findViewById 放在同一行

Android Child Activity Canvas Size Width Limited

android - 在 android 上使用 com.bea.xml.stream 包

android - 在为其他人开发应用程序时,建议使用哪个程序包名称将其上传到商店?

ios - 通过在 iOS 中连接表从 Firebase 获取数据

c# - 如何从 C# 正确关闭 java 应用程序

android - Firebase 云消息传递错误 : Couldn't resolve host 'fcm.googleapis.com'

javascript - React.js 从特定行检索数据