【问题标题】:Recyclerview is blank when getting data from firebase从firebase获取数据时Recyclerview为空白
【发布时间】:2019-11-08 16:06:59
【问题描述】:

我正在从 Firebase 获取数据并将其显示在回收站视图中。当我运行它时,什么都没有出现,我也没有收到任何错误。调试器显示我正在正确检索所有数据,但它显示 arraylist 一直返回零大小。

这是我的数据库结构:

{
 "Classes" : {
   "-LiGRe3e1YF_HFrHKMgi" : {
  "Students" : {
    "-LiId4URjJ8SWLAP4f4i" : "UhTQgJ4jugMqFtEZK8CsIkTqQl22",
    "-LiIeT5t1T7JpcUee_MJ" : "UhTQgJ4jugMqFtEZK8CsIkTqQl22"
  },
  "class_info" : {
    "date_clasname" : "mm",
    "room_number" : "jjhh",
    "subject" : "Science",
    "teacher" : "mm",
    "uid" : "-LiGRe3e1YF_HFrHKMgi"
  }
}
  },
   "Users" : {
    "UhTQgJ4jugMqFtEZK8CsIkTqQl22" : {
    "Classes" : {
    "-LiIeT5slTjC0B3lEqNJ" : "-LiGRe3e1YF_HFrHKMgi"
    "-LiIeT5slTjC0B3lEqNJ" : "-LiGRe3e1YF_HFrHKMgi"
  },
    "User_info" : {
    "email" : "samuelford48@gmail.com",
    "grade" : "12",
    "name" : "Samuel"
  }

这是我的活动的代码:

public class home_fragment extends Fragment implements View.OnClickListener {
private Button button;
//DatabaseReference dref;
//ListView listview2;
//ArrayList<String> list=new ArrayList<>();
private FirebaseDatabase database;
private DatabaseReference myRef;
private List<Listdata> list;
private RecyclerView recyclerview;
public home_fragment() {

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.home_fragment, container, false);
    //FirebaseUser fbUser = FirebaseAuth.getInstance().getCurrentUser();
    //if(fbUser == null) { Intent intent = new Intent(getContext(), LoginActivity.class);
    // startActivity(intent);}

    button = (Button) view.findViewById(R.id.button);
    button.setOnClickListener(this);
    recyclerview = (RecyclerView) view.findViewById(R.id.rview);
    database = FirebaseDatabase.getInstance();
    myRef = database.getReference("Users")
            .child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("Classes");
    myRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, String s) {

            list = new ArrayList<>();
                String class_id = dataSnapshot.getValue(String.class);

                myRef = database.getReference("Classes").child(class_id).child("class_info");
            // StringBuffer stringbuffer = new StringBuffer();
            myRef.addListenerForSingleValueEvent(new ValueEventListener() {


                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                        Class_model new_class = dataSnapshot.getValue(Class_model.class);
                        assert new_class != null;
                        String nameofclass = new_class.getDate_clasname();
                        String teacherofclass = new_class.getTeacher();
                        String roomnumberofclass = new_class.getRoom_number();
                        String class_key = new_class.getUid();
                        Listdata listdata = new Listdata(nameofclass, teacherofclass, roomnumberofclass, class_key);
                        //String name = userdetails.getName();
                        //String email = userdetails.getEmail();
                        //String address = userdetails.getAddress();
                        listdata.setDate_class(nameofclass);
                        listdata.setTeacher(teacherofclass);
                        listdata.setRnumber(roomnumberofclass);
                    list.add(listdata);
                        // Toast.makeText(MainActivity.this,""+name,Toast.LENGTH_LONG).show();
                    }


                @Override
                public void onCancelled(DatabaseError error) {
                    AlertDialog alertDialog = new AlertDialog.Builder(getContext()).create();
                    alertDialog.setTitle("Error");
                    alertDialog.setMessage("Check your connection! If, problem persists please email svhsdev@vigoschools.org!");
                    alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.dismiss();
                                }
                            });
                    alertDialog.show();
                }

            });

            RecyclerviewAdapter2 recycler = new RecyclerviewAdapter2(list);
            RecyclerView.LayoutManager layoutmanager = new LinearLayoutManager(getContext());
            recyclerview.setLayoutManager(layoutmanager);
            recyclerview.setItemAnimator(new DefaultItemAnimator());
            recyclerview.setAdapter(recycler);

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

        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

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

        }
        @Override
        public void onCancelled(DatabaseError error) {
            AlertDialog alertDialog = new AlertDialog.Builder(getContext()).create();
            alertDialog.setTitle("Error");
            alertDialog.setMessage("Check your connection! If, problem persists please email svhsdev@vigoschools.org!");
            alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
            alertDialog.show();
        }

                                });
    return view;
}
@Override
public void onClick(View view) {
    signout();



    //startActivity(new Intent(home_fragment.this, LoginActivity.class));

}
public void signout(){
    FirebaseAuth.getInstance().signOut();
    Intent intent = new Intent(getContext(), LoginActivity.class);
    startActivity(intent);


   }
 }

首先,Activity 获取类的 id,这些 id 存储在用户的类下,然后它获取类信息并将其显示在 recyclerview 中。 这是我的适配器的代码(这里应该没有问题):

public class RecyclerviewAdapter2 extends RecyclerView.Adapter<RecyclerviewAdapter2.MyHolder>{

List<Listdata> listdata;

public RecyclerviewAdapter2(List<Listdata> listdata) {
    this.listdata = listdata;
}

@Override
public RecyclerviewAdapter2.MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_class_model,parent,false);

    RecyclerviewAdapter2.MyHolder myHolder = new RecyclerviewAdapter2.MyHolder(view);
    return myHolder;
}


public void onBindViewHolder(RecyclerviewAdapter2.MyHolder holder, final int position) {
    final Listdata data = listdata.get(position);
    holder.vdate_class.setText(data.getDate_class());
    holder.vteacher.setText(data.getTeacher());
    holder.vrnumber.setText(data.getRnumber());
    //System.out.println(data.getDate_class2());
    holder.itemView.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick( final View view) {
            Context context = view.getContext();
            Intent intent = new Intent(context, Add_class_to_user.class);
            intent.putExtra("date_class", listdata.get(position).getDate_class());
            intent.putExtra("teacher", listdata.get(position).getTeacher());
            intent.putExtra("room_number", listdata.get(position).getRnumber());
            intent.putExtra("post_key", listdata.get(position).getUid());
            context.startActivity(intent);
        }
    });

}

@Override
public int getItemCount() {
    return listdata.size();
}


class MyHolder extends RecyclerView.ViewHolder{
    TextView vdate_class , vteacher,vrnumber;

    public MyHolder(View itemView) {
        super(itemView);
        vdate_class = (TextView) itemView.findViewById(R.id.date_class_name);
        vteacher = (TextView) itemView.findViewById(R.id.teacher);
        vrnumber = (TextView) itemView.findViewById(R.id.room_number);

    }
   }

}

谢谢您,如果您有任何问题,请告诉我!

【问题讨论】:

    标签: android firebase android-fragments firebase-realtime-database android-recyclerview


    【解决方案1】:

    您需要在数据添加到列表后调用ADAPTER_NAME.notifyDataSetChanged() 以反映RecyclerView 中的更改。不要忘记将ADAPTER_NAME 替换为实际的适配器名称。

    【讨论】:

    • 您应该在将项目添加到列表后执行adapter.notifyDataSetChanged()
    【解决方案2】:

    你在调用这个逻辑

     database = FirebaseDatabase.getInstance();
        myRef = database.getReference("Users")
                .child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("Classes");
        myRef.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, String s) {
    
                list = new ArrayList<>();
                    String class_id = dataSnapshot.getValue(String.class);
    
                    myRef = database.getReference("Classes").child(class_id).child("class_info");
                // StringBuffer stringbuffer = new StringBuffer();
                myRef.addListenerForSingleValueEvent(new ValueEventListener() {
    
    
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    
                            Class_model new_class = dataSnapshot.getValue(Class_model.class);
                            assert new_class != null;
                            String nameofclass = new_class.getDate_clasname();
                            String teacherofclass = new_class.getTeacher();
                            String roomnumberofclass = new_class.getRoom_number();
                            String class_key = new_class.getUid();
                            Listdata listdata = new Listdata(nameofclass, teacherofclass, roomnumberofclass, class_key);
                            //String name = userdetails.getName();
                            //String email = userdetails.getEmail();
                            //String address = userdetails.getAddress();
                            listdata.setDate_class(nameofclass);
                            listdata.setTeacher(teacherofclass);
                            listdata.setRnumber(roomnumberofclass);
                        list.add(listdata);
                            // Toast.makeText(MainActivity.this,""+name,Toast.LENGTH_LONG).show();
                        }
    
    
                    @Override
                    public void onCancelled(DatabaseError error) {
                        AlertDialog alertDialog = new AlertDialog.Builder(getContext()).create();
                        alertDialog.setTitle("Error");
                        alertDialog.setMessage("Check your connection! If, problem persists please email svhsdev@vigoschools.org!");
                        alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {
                                        dialog.dismiss();
                                    }
                                });
                        alertDialog.show();
                    }
    
                });
    
                RecyclerviewAdapter2 recycler = new RecyclerviewAdapter2(list);
                RecyclerView.LayoutManager layoutmanager = new LinearLayoutManager(getContext());
                recyclerview.setLayoutManager(layoutmanager);
                recyclerview.setItemAnimator(new DefaultItemAnimator());
                recyclerview.setAdapter(recycler);
    
            }
            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
    
            }
    
            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
    
            }
    
            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
    
            }
            @Override
            public void onCancelled(DatabaseError error) {
                AlertDialog alertDialog = new AlertDialog.Builder(getContext()).create();
                alertDialog.setTitle("Error");
                alertDialog.setMessage("Check your connection! If, problem persists please email svhsdev@vigoschools.org!");
                alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        });
                alertDialog.show();
            }
    
                                    });
    

    在你的onCreateView()方法中,因为这是一个Fragment,在onCreateView()你应该只有视图初始化,然后在onViewCreated()或onActivityCreated()你应该有上面的代码。

    我认为问题的出现是因为在实例化视图后,您调用了一个异步过程(从 firebase 获取数据)来填充您的 RecyclerView,但未达到 RecyclerView 视图。

    【讨论】:

    • 你能告诉我怎么做吗?我试过了,我不确定我做对了,但它没有用
    • 只需像使用 onCreateView() 一样覆盖 onViewCreated()
    猜你喜欢
    • 1970-01-01
    • 2021-07-24
    • 2020-10-10
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多