Recyclerview пусто при получении данных из firebase - PullRequest
0 голосов
/ 26 июня 2019

Я получаю данные из Firebase и отображаю их в виде переработчика. Когда я запускаю его, ничего не появляется, и я не получаю никаких ошибок. Отладчик показывает, что я правильно извлекаю все данные, но показывает, что массив продолжает возвращать ноль.

Вот моя структура базы данных:

{
 "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);


   }
 }

Сначала действие получает идентификаторы классов, которые хранятся в классах пользователя, затем получает информацию о классе и отображает ее в представлении реселлера. Вот код для моего адаптера (здесь не должно быть проблем):

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

    }
   }

}

Спасибо и дайте мне знать, если у вас есть какие-либо вопросы!

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Вам нужно позвонить ADAPTER_NAME.notifyDataSetChanged() после добавления данных в список, чтобы отразить изменения в RecyclerView.Не забудьте заменить ADAPTER_NAME фактическим именем адаптера.

0 голосов
/ 27 июня 2019

Вы вызываете эту логику

 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() метода, поскольку это фрагмент, внутри onCreateView() у вас должна быть только инициализация представления, затем в onViewCreated() или onActivityCreated() у вас должен быть вышеуказанный код.

Я думаю, что проблема возникает из-за того, что после создания ваших представлений вы вызываете асинхронный процесс (получение данных из firebase), чтобы заполнить ваш RecyclerView, но представление RecyclerViewне достигается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...