onDataChange () возвращает мне значения дважды - PullRequest
1 голос
/ 01 мая 2020

У меня проблема с моим кодом. Я целый день пытался разрешить этот код, но не могу, не знаю, как это сделать. Проблема в том, что onDataChange () возвращает мне повторяющиеся значения. Я попытался добавить эту строку «addListenerForSingleValueEvent ()», а также отключить автономную устойчивость Firebase, написав «FirebaseDatabase.getInstance (). SetPersistenceEnabled (false);» но это не сработало. Я получаю дубликаты значений (см. Изображение ниже). Дублирует значения

Мой код для извлечения данных из Firebase:

    @Override
public void onStart() {
    super.onStart();
    options = new FirebaseRecyclerOptions.Builder<Course>().setQuery(reference, Course.class).build();
    adapter = new FirebaseRecyclerAdapter<Course, CourseViewHolder>(options) {
        @Override
        protected void onBindViewHolder(@NonNull final CourseViewHolder courseViewHolder, int i, @NonNull Course course) {
            reference.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for(DataSnapshot ds: dataSnapshot.getChildren()){
                        String course_name = ds.child("Course name").getValue().toString();
                        courseViewHolder.courseRealName.setText(course_name);
                        Log.d(TAG, course_name);
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });


        }

        @NonNull
        @Override
        public CourseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.create_course_view,parent, false);
            CourseViewHolder viewHolder = new CourseViewHolder(v);
            return  viewHolder;
        }
    };
    adapter.startListening();
    recyclerView.setAdapter(adapter);
}

Код RecyclerView

            @NonNull
        @Override
        public CourseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.create_course_view,parent, false);
            CourseViewHolder viewHolder = new CourseViewHolder(v);
            return  viewHolder;
        }
    };
    adapter.startListening();
    recyclerView.setAdapter(adapter);
}


public static class CourseViewHolder extends RecyclerView.ViewHolder{

    TextView courseName, courseRealName,numberOfStudent, realNumberOfStudents;

    public CourseViewHolder(@NonNull View itemView) {
        super(itemView);
        courseName = itemView.findViewById(R.id.denCursList);
        courseRealName = itemView.findViewById(R.id.realCourseName);
        numberOfStudent = itemView.findViewById(R.id.numarStudentiInfo);
        realNumberOfStudents = itemView.findViewById(R.id.numarRealStudenti);
    }
}

Я жду ответ. Спасибо!

1 Ответ

1 голос
/ 02 мая 2020

Хорошо. Класс должен быть таким:

public class Course{

//these must be exactly same as the database naming, and the same fields

private String CourseID;
private String Coursedescription;
private String Coursename;
private int Coursepoints;
private int Coursestudents;
private String TeacherID;


//constructor

public Course(String CourseID, String Coursedescription, String Coursename,int Coursepoints , int Coursestudents, String TeacherID) {
    this.CourseID = CourseID;
    this.Coursedescription = Coursedescription;
    this.Coursename = Coursename;
    this.Coursepoints = Coursepoints;
    this.Coursestudents = Coursestudents;
    this.TeacherID = TeacherID;
}



//generate getters and setters..........

}

И в onBindViewHolder() нет необходимости в слушателе:

adapter = new FirebaseRecyclerAdapter<Course, CourseViewHolder>(options) {
    @Override
    protected void onBindViewHolder(@NonNull final CourseViewHolder courseViewHolder, int i, @NonNull Course course) {


     //set directly
     courseViewHolder.courseRealName.setText(course.getCoursename());




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