读取Firebase数据库并在RecyclerView中显示:Android

读取Firebase数据库并在RecyclerView中显示:Android,android,firebase,firebase-realtime-database,android-recyclerview,Android,Firebase,Firebase Realtime Database,Android Recyclerview,这是我的代码: Liste.java文件: public class Liste extends AppCompatActivity{ RecyclerView myRecyclerview; MyAdapter adapter; List<Dentist> listDentist; FirebaseDatabase FDB; DatabaseReference DBR; @Override protected void o

这是我的代码:

Liste.java文件:

public class Liste extends AppCompatActivity{

    RecyclerView myRecyclerview;
    MyAdapter adapter;
    List<Dentist> listDentist;
    FirebaseDatabase FDB;
    DatabaseReference DBR;

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

        myRecyclerview = (RecyclerView) findViewById ( R.id.myRecycler );
        RecyclerView.LayoutManager LM = new LinearLayoutManager ( getApplicationContext ());
        myRecyclerview.setLayoutManager ( LM );
        myRecyclerview.setItemAnimator ( new DefaultItemAnimator () );
        myRecyclerview.addItemDecoration ( new DividerItemDecoration ( getApplicationContext (),LinearLayoutManager.VERTICAL ) );

        listDentist = new ArrayList<> (  );

        adapter = new MyAdapter (listDentist);

        FDB= FirebaseDatabase.getInstance ();
        GetDataFirebase();

 void GetDataFirebase(){
        DBR = FDB.getReference ("dentistes");

        DBR.addChildEventListener ( new ChildEventListener ( ) {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                Dentist data = dataSnapshot.getValue (Dentist.class);
                //Add to Arraylist
                listDentist.add ( data );
                //Add list into adapter
                myRecyclerview.setAdapter ( adapter );


            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        } );
    }


public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{

        List<Dentist> listArray;

        public MyAdapter (List<Dentist> List){
            this.listArray = List;
        }

        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from ( parent.getContext ()).inflate ( R.layout.itemview,parent,false );
            return new MyViewHolder(view);
        }

        @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
            Dentist data = listArray.get ( position );
            holder.MyText.setText ( data.getName () );
        }
        public class MyViewHolder extends RecyclerView.ViewHolder{
            TextView MyText;

            public MyViewHolder(View itemView) {
                super ( itemView );
                MyText = (TextView)itemView.findViewById ( R.id.textview_dentist );
            }
        }

        @Override
        public int getItemCount() {
            return listArray.size ();
        }
    }
}
public class Dentist {
    private String Name;

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }
}
我有两个问题:


  • 牙医列表正确显示在my Recyclerview中,但logcat显示“E/Recyclerview:未连接适配器;跳过布局”:我如何更正此问题

  • 如果我更改了类模型的结构:例如,我添加了地址和电话号码:我应该如何更改代码,以便在我的Recyclerview中显示每个牙医的姓名、地址和号码


要解决这个问题,请参阅下面我的答案:

  • 移动这行代码

    adapter = new MyAdapter(listDentist);
    
  • 内部
    onchildaded()
    方法。必须在此方法中声明并使用适配器

  • 您需要通过添加那些私有字段和相应的公共setter和getter来更改
    Dentist

  • 要消除logcat中的警告,请在onCreate方法中设置适配器,并在onChildaded方法中调用adapter.notifyDataSetChanged()以更新值

        public class Liste extends AppCompatActivity{
    
        RecyclerView myRecyclerview;
        MyAdapter adapter;
        List<Dentist> listDentist;
        FirebaseDatabase FDB;
        DatabaseReference DBR;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate ( savedInstanceState );
            setContentView ( R.layout.activity_liste );
    
            myRecyclerview = (RecyclerView) findViewById ( R.id.myRecycler );
            RecyclerView.LayoutManager LM = new LinearLayoutManager ( getApplicationContext ());
            myRecyclerview.setLayoutManager ( LM );
            myRecyclerview.setItemAnimator ( new DefaultItemAnimator () );
            myRecyclerview.addItemDecoration ( new DividerItemDecoration ( getApplicationContext (),LinearLayoutManager.VERTICAL ) );
    
            listDentist = new ArrayList<> (  );
    
            adapter = new MyAdapter (listDentist);
    
           //Set empty adapter here
            myRecyclerView.setAdapter(adapter);
    
            FDB= FirebaseDatabase.getInstance ();
            GetDataFirebase();
    
     void GetDataFirebase(){
            DBR = FDB.getReference ("dentistes");
    
            DBR.addChildEventListener ( new ChildEventListener ( ) {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    
                    Dentist data = dataSnapshot.getValue (Dentist.class);
                    //Add to Arraylist
                    listDentist.add ( data );
                    //Add list into adapter
    
    
                   adapter.notifyDataSetChanged();
    
                }
    
                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {
    
                }
    
                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {
    
                }
    
                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {
    
                }
    
                @Override
                public void onCancelled(DatabaseError databaseError) {
    
                }
            } );
        }
    
    
    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
    
            List<Dentist> listArray;
    
            public MyAdapter (List<Dentist> List){
                this.listArray = List;
            }
    
            @Override
            public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View view = LayoutInflater.from ( parent.getContext ()).inflate ( R.layout.itemview,parent,false );
                return new MyViewHolder(view);
            }
    
            @Override
            public void onBindViewHolder(MyViewHolder holder, int position) {
                Dentist data = listArray.get ( position );
                holder.MyText.setText ( data.getName () );
            }
            public class MyViewHolder extends RecyclerView.ViewHolder{
                TextView MyText;
    
                public MyViewHolder(View itemView) {
                    super ( itemView );
                    MyText = (TextView)itemView.findViewById ( R.id.textview_dentist );
                }
            }
    
            @Override
            public int getItemCount() {
                return listArray.size ();
            }
        }
    }
    
    公共类列表扩展了AppCompative活动{
    回收视图myRecyclerview;
    MyAdapter适配器;
    名单;
    FirebaseDatabaseFDB;
    数据库参考数据库;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_liste);
    myRecyclerview=(RecyclerView)findViewById(R.id.myRecycler);
    RecyclerView.LayoutManager LM=新的LinearLayoutManager(getApplicationContext());
    myRecyclerview.setLayoutManager(LM);
    myRecyclerview.setItemAnimator(新的DefaultItemAnimator());
    myRecyclerview.addItemDecoration(新的DividerItemDecoration(getApplicationContext(),LinearLayoutManager.VERTICAL));
    listdister=newarraylist();
    适配器=新的MyAdapter(列表);
    //在此设置空适配器
    myRecyclerView.setAdapter(适配器);
    FDB=FirebaseDatabase.getInstance();
    GetDataFirebase();
    void GetDataFirebase(){
    DBR=FDB.getReference(“牙医”);
    DBR.addChildEventListener(新的ChildEventListener(){
    @凌驾
    公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
    牙医数据=dataSnapshot.getValue(牙医类);
    //添加到Arraylist
    listdistent.add(数据);
    //将列表添加到适配器中
    adapter.notifyDataSetChanged();
    }
    @凌驾
    公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
    }
    @凌驾
    ChildRemoved上的公共void(DataSnapshot DataSnapshot){
    }
    @凌驾
    已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){
    }
    @凌驾
    已取消的公共void(DatabaseError DatabaseError){
    }
    } );
    }
    公共类MyAdapter扩展了RecyclerView.Adapter{
    列表数组;
    公共MyAdapter(列表){
    this.listary=List;
    }
    @凌驾
    公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
    View View=LayoutInflater.from(parent.getContext()).flate(R.layout.itemview,parent,false);
    返回新的MyViewHolder(视图);
    }
    @凌驾
    公共无效onBindViewHolder(MyViewHolder,int位置){
    数据=listary.get(位置);
    holder.MyText.setText(data.getName());
    }
    公共类MyViewHolder扩展了RecyclerView.ViewHolder{
    文本查看我的文本;
    公共MyViewHolder(查看项目视图){
    超级(项目视图);
    MyText=(TextView)itemView.findViewById(R.id.TextView\u);
    }
    }
    @凌驾
    public int getItemCount(){
    返回listArray.size();
    }
    }
    }
    

    对于Alex Mamo提到的第二个问题,您需要在牙医类中添加所需的字段以及相应的getter和setter。

    1-消息“E/RecyclerView:未连接适配器;跳过布局”总是显示在日志cat.2中-我知道我应该将这些私有字段添加到Destinter类中,但我在如何更改Liste.java文件中的代码方面遇到了障碍。请确保您是从onchildaded()中的“main”线程调用该语句方法。这是您唯一要执行此操作的地方。也在该方法中声明
    myRecyclerview
    。它现在起作用了吗?牙医列表正确显示在我的Recyclerview中,但日志再次显示此错误:但这不是问题。我需要我的问题的答案第二个问题。正如前面回答的,首先你需要更改模型类,然后通过每个牙医的孩子循环获取数据。现在可以了吗?我的答案有什么问题?请给我一个解释。
    adapter = new MyAdapter(listDentist);
    
        public class Liste extends AppCompatActivity{
    
        RecyclerView myRecyclerview;
        MyAdapter adapter;
        List<Dentist> listDentist;
        FirebaseDatabase FDB;
        DatabaseReference DBR;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate ( savedInstanceState );
            setContentView ( R.layout.activity_liste );
    
            myRecyclerview = (RecyclerView) findViewById ( R.id.myRecycler );
            RecyclerView.LayoutManager LM = new LinearLayoutManager ( getApplicationContext ());
            myRecyclerview.setLayoutManager ( LM );
            myRecyclerview.setItemAnimator ( new DefaultItemAnimator () );
            myRecyclerview.addItemDecoration ( new DividerItemDecoration ( getApplicationContext (),LinearLayoutManager.VERTICAL ) );
    
            listDentist = new ArrayList<> (  );
    
            adapter = new MyAdapter (listDentist);
    
           //Set empty adapter here
            myRecyclerView.setAdapter(adapter);
    
            FDB= FirebaseDatabase.getInstance ();
            GetDataFirebase();
    
     void GetDataFirebase(){
            DBR = FDB.getReference ("dentistes");
    
            DBR.addChildEventListener ( new ChildEventListener ( ) {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    
                    Dentist data = dataSnapshot.getValue (Dentist.class);
                    //Add to Arraylist
                    listDentist.add ( data );
                    //Add list into adapter
    
    
                   adapter.notifyDataSetChanged();
    
                }
    
                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {
    
                }
    
                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {
    
                }
    
                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {
    
                }
    
                @Override
                public void onCancelled(DatabaseError databaseError) {
    
                }
            } );
        }
    
    
    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
    
            List<Dentist> listArray;
    
            public MyAdapter (List<Dentist> List){
                this.listArray = List;
            }
    
            @Override
            public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View view = LayoutInflater.from ( parent.getContext ()).inflate ( R.layout.itemview,parent,false );
                return new MyViewHolder(view);
            }
    
            @Override
            public void onBindViewHolder(MyViewHolder holder, int position) {
                Dentist data = listArray.get ( position );
                holder.MyText.setText ( data.getName () );
            }
            public class MyViewHolder extends RecyclerView.ViewHolder{
                TextView MyText;
    
                public MyViewHolder(View itemView) {
                    super ( itemView );
                    MyText = (TextView)itemView.findViewById ( R.id.textview_dentist );
                }
            }
    
            @Override
            public int getItemCount() {
                return listArray.size ();
            }
        }
    }