【问题标题】:onDataChange() return me values twiceonDataChange() 两次返回值
【发布时间】:2020-05-01 20:33:22
【问题描述】:

我的代码有问题。我整天都在尝试解决此代码,但我不能,我不知道该怎么做。问题是 onDataChange() 返回重复值。我试图添加这一行“addListenerForSingleValueEvent()”,并通过编写“FirebaseDatabase.getInstance().setPersistenceEnabled(false);”来禁用 Firebase 的离线持久性。但它没有用。我最终得到重复值(见下图)。 Duplicates values

我从 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);
}

回收站查看代码

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

我正在等待回复。谢谢!

【问题讨论】:

  • 使用course对象作为数据源,而不是实现reference.addListenerForSingleValueEvent
  • 我试过了,但它在 RecyclerView 上什么也没返回
  • 那么问题出在您使用adapter的查询设置中
  • 添加数据库截图,添加数据库引用的代码,以及设置recyclerview的代码。
  • @HasanBouTaam 我已经用我的 Firebase 数据库上传了一个屏幕截图。

标签: java android firebase firebase-realtime-database


【解决方案1】:

好的,班级一定是这样的:

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




}

【讨论】:

  • 您的班级Course database中的间距、大写、小写必须完全相同。
  • 课程必须有私有字符串课程ID之类的代码,还是只是私有字符串ID?还是我必须另写几行?
  • 您必须重写类,以使字段与数据库中的字段完全相同。
  • 如果它写入数据库Course ID,它必须在类Course ID
  • 在我的回答中,我向您展示了哪些必须是Strings,哪些必须是ints
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
相关资源
最近更新 更多