Android FirebaseRecyclerAdapter未调用BindViewHolder且未显示数据

Android FirebaseRecyclerAdapter未调用BindViewHolder且未显示数据,android,firebase,firebase-realtime-database,firebaseui,Android,Firebase,Firebase Realtime Database,Firebaseui,我正在尝试使用FirebaseRecyclerAdapter在RecyclerView的屏幕上显示数据,但没有显示任何数据。我使用了调试模式来确定在将新项添加到列表中时,不会调用onBindViewHolder,但会正确地将其添加到数据库中。我已经查看了所有的堆栈溢出,但没有一个发布的解决方案有帮助 以下是我的数据库结构: 这是我的片段代码: package com.jggdevelopment.wannacook.fragments; import android.os.Bundl

我正在尝试使用FirebaseRecyclerAdapter在RecyclerView的屏幕上显示数据,但没有显示任何数据。我使用了调试模式来确定在将新项添加到列表中时,不会调用onBindViewHolder,但会正确地将其添加到数据库中。我已经查看了所有的堆栈溢出,但没有一个发布的解决方案有帮助

以下是我的数据库结构:

这是我的片段代码:

    package com.jggdevelopment.wannacook.fragments;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.jggdevelopment.wannacook.AddItemDialogFragment;
import com.jggdevelopment.wannacook.InventoryAdapter;
import com.jggdevelopment.wannacook.InventoryItem;
import com.jggdevelopment.wannacook.MyViewHolder;
import com.jggdevelopment.wannacook.R;

import java.util.ArrayList;

/**
 * Handles actions taken inside the "Fridge" tab of the app.
 * Created by Cameron on 1/18/2018.
 */

public class FridgeFragment extends Fragment {

    private ArrayList<InventoryItem> items = new ArrayList<>();
    private static final String TAG = "FridgeFragement";
    private FirebaseRecyclerAdapter<InventoryItem, FridgeHolder> firebaseRecyclerAdapter;
    private RecyclerView rvItems;

    public FridgeFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_fridge, container, false);
        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference("/users");

        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

        String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
        Query query = rootRef.child(uid).child("fridge");

        //Lookup recycler view in activity layout
        rvItems = view.findViewById(R.id.fridge_list);

        // Set layout manager to position the items
        rvItems.setLayoutManager(new LinearLayoutManager(getContext()));



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

        firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<InventoryItem, FridgeHolder>(options) {
            @NonNull
            @Override
            public FridgeHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.inventory_card, parent, false);

                return new FridgeHolder(view);
            }

            @Override
            protected void onBindViewHolder(@NonNull FridgeHolder holder, int position, @NonNull InventoryItem item) {
                super.onBindViewHolder(holder, position);
                holder.setItem(item);
                Log.d("TAG", item.getItemName());
            }


        };


        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        firebaseRecyclerAdapter.startListening();
        rvItems.setAdapter(firebaseRecyclerAdapter);
    }

    @Override
    public void onStop() {
        super.onStop();

        if (firebaseRecyclerAdapter != null) {
            firebaseRecyclerAdapter.stopListening();
        }
    }

    private class FridgeHolder extends RecyclerView.ViewHolder {

        private final ImageView image;
        private final TextView itemName;
        private final TextView itemQuantity;

        public FridgeHolder(View itemView) {
            super(itemView);

            image = itemView.findViewById(R.id.item_photo);
            itemName = itemView.findViewById(R.id.item_name);
            itemQuantity = itemView.findViewById(R.id.item_quantity);
        }

        public void setItem(InventoryItem item) {
            itemName.setText(item.getItemName());
            itemQuantity.setText(item.getQuantity());
        }
    }
}
package com.jggdevelopment.wannacook.fragments;
导入android.os.Bundle;
导入android.support.annotation.NonNull;
导入android.support.v4.app.Fragment;
导入android.support.v4.app.FragmentManager;
导入android.support.v7.app.app代理;
导入android.support.v7.widget.LinearLayoutManager;
导入android.support.v7.widget.RecyclerView;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ImageView;
导入android.widget.TextView;
导入com.firebase.ui.database.FirebaseRecyclerAdapter;
导入com.firebase.ui.database.FirebaseRecyclerOptions;
导入com.google.firebase.auth.FirebaseAuth;
导入com.google.firebase.database.ChildEventListener;
导入com.google.firebase.database.DataSnapshot;
导入com.google.firebase.database.DatabaseError;
导入com.google.firebase.database.DatabaseReference;
导入com.google.firebase.database.FirebaseDatabase;
导入com.google.firebase.database.Query;
导入com.jggdevelopment.wannacook.AddItemDialogFragment;
导入com.jggdevelopment.wannacook.InventoryAdapter;
导入com.jggdevelopment.wannacook.InventoryItem;
导入com.jggdevelopment.wannacook.MyViewHolder;
导入com.jggdevelopment.wannacook.R;
导入java.util.ArrayList;
/**
*处理在应用程序的“冰箱”选项卡内执行的操作。
*由Cameron于2018年1月18日创建。
*/
公共类FridgeFragment扩展了该片段{
private ArrayList items=new ArrayList();
私有静态最终字符串TAG=“FridgeFragement”;
私人FirebaseRecyclerAdapter FirebaseRecyclerAdapter;
私人回收物品;
公共冰箱碎片(){
//必需的空公共构造函数
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u冰箱,容器,错误);
DatabaseReference rootRef=FirebaseDatabase.getInstance().getReference(“/users”);
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
字符串uid=FirebaseAuth.getInstance().getCurrentUser().getUid();
Query=rootRef.child(uid.child(“冰箱”);
//在活动布局中查找回收器视图
rvItems=view.findviewbyd(R.id.冰箱列表);
//设置布局管理器以定位项目
setLayoutManager(新的LinearLayoutManager(getContext());
FirebaseRecyclerOptions选项=新建FirebaseRecyclerOptions.Builder()
.setQuery(查询,InventoryItem.class)
.build();
firebaseRecyclerAdapter=新的firebaseRecyclerAdapter(选项){
@非空
@凌驾
公共冰箱架onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.inventory\u card,parent,false);
归还新冰箱架(视图);
}
@凌驾
受保护的无效onBindViewHolder(@NonNull FridgeHolder,int位置,@NonNull InventoryItem){
super.onBindViewHolder(支架,位置);
持有人。设定项目(项目);
Log.d(“TAG”,item.getItemName());
}
};
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
返回视图;
}
@凌驾
public void onStart(){
super.onStart();
firebaseRecyclerAdapter.startListening();
rvItems.setAdapter(firebaseRecyclerAdapter);
}
@凌驾
公共void onStop(){
super.onStop();
如果(firebaseRecyclerAdapter!=null){
firebaseRecyclerAdapter.stopListening();
}
}
私有类冰箱架扩展了RecyclerView.ViewHolder{
私有最终图像查看图像;
私有最终文本视图项目名称;
私有最终文本视图项目数量;
公共冰箱架(查看项目视图){
超级(项目视图);
image=itemView.findviewbyd(R.id.item\u照片);
itemName=itemView.findviewbyd(R.id.item\u name);
itemQuantity=itemView.findViewById(R.id.item\u数量);
}
公共无效集合项(InventoryItem){
itemName.setText(item.getItemName());
itemQuantity.setText(item.getQuantity());
}
}
}

可以在Github上找到完整的代码:

您是否确保您的数据库安全规则是正确的,并且登录的用户具有读取该路径的权限?如果确实存在权限问题,您应该在日志中看到
com.google.firebase.database.DatabaseException

在根查询中,您有
/users
。删除
/

是的,它表示存在数据库异常。如何设置权限以避免这种情况?{“规则”:{“用户”:{“$uid”:{.write”:“$uid===auth.uid”}}}}}这些是原始规则,我刚刚添加了“.read”:“$uid===auth.uid”,现在每次我单击fridge选项卡打开片段时,它都会在“super.onBindViewHolder()”行上循环,只是无限地呼唤