Проблема синхронизации при чтении данных из firebase - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть класс java (CourseViewTeachers), где я читаю имя пользователя из базы данных firebase, используя uid пользователя. Я написал код для чтения данных в конструкторе этого класса. Конструктор приведен ниже.

public CourseViewTeachers(Courses courses)
{
    super(courses.getCourse_uid(), courses.getTecher_uid(), courses.getName());
    databaseReference =  FirebaseDatabase.getInstance().getReference().child("users").child(getTecher_uid());
    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            User teacher = dataSnapshot.getValue(User.class);
            teacherName = teacher.getUser_name();
        }

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

        }
    });
}

Я использую этот класс для заполнения пользовательского адаптера массива. Когда я создаю объект этого класса во фрагменте и возвращаю переменную 'teacherName', он возвращает ноль. Код, где я заполняю адаптер, приведен ниже

courseListView = view.findViewById(R.id.my_courses_list);
courseListView.setAdapter(adapter);
databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                courseList.clear();
                for(DataSnapshot snapshot : dataSnapshot.getChildren())
                {
                    CourseViewTeachers courses = new CourseViewTeachers(snapshot.getValue(Courses.class));

                    if(courses.getTecher_uid().equals(fb_user.getUid()))
                    {
                        courseList.add(courses);

                    }
                }
                adapter.notifyDataSetChanged();
            }

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

            }
        });

У меня два вопроса:

  • Почему это происходит?
  • Как решить эту проблему?

Редактировать: чтобы уточнить, где я получаю нольПеременная адаптера во втором фрагменте кода является объектом класса адаптера пользовательского массива. В getView () функции arrayAdapter вызывает getTeacherName () класса CourseViewTeachers. Эта функция просто возвращает значение переменной 'teacherName'. Код специального адаптера массива:

public class CourseViewTeachersAdapter extends ArrayAdapter<CourseViewTeachers> {

private Context context;
private List<CourseViewTeachers> list;

public CourseViewTeachersAdapter(@NonNull Context context, ArrayList<CourseViewTeachers> list)
{
    super(context, 0 , list);
    this.context = context;
    this.list = list;
}

public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent)
{
    View listItem = convertView;
    if(listItem == null)
        listItem = LayoutInflater.from(context).inflate(R.layout.course_view_teachers_layout,parent,false);

    CourseViewTeachers obj = list.get(position);

    TextView courseView = listItem.findViewById(R.id.course_teachers_view_course_name);
    courseView.setText(obj.getName());

    TextView teacherName = listItem.findViewById(R.id.course_teachers_view_teacher_name);
    teacherName.setText("Teacher : " + obj.getTeacherName());

    return listItem;
}

}

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