ListAdapter提交数据后无法完整显示内容的技术问题排查
ListAdapter无法显示完整数据问题排查
我在将数据提交至ListAdapter时遇到问题,无法显示全部数据。
ViewModel实现逻辑
在我的ViewModel中,我从Firebase获取数据用于展示。具体实现为:通过getAllStudents()函数调用Firestore中Collection引用的get()方法,返回的是ID,随后我通过其他函数获取这些ID对应的实际数据。但我认为问题在于,每次获取到任意一个ID对应的数据后,我就向LiveData发送数据,此时数据并不完整,导致ListAdapter提交的是不完整数据;最终数据完整时,Adapter也无法更新所有条目。
ViewModel函数示例
我有4个函数,每个函数获取到数据后都会调用LiveData的postValue()方法
示例代码
@Override public void onSuccess(QuerySnapshot querySnapshot) { _uiState.postValue(false); for (DocumentSnapshot item:querySnapshot){ Student studentItem = item.toObject(Student.class); if (studentItem.id.equals(student.id)){ for (StudentDetails studentDetails:studentsDetailsList){ if (studentDetails.studentId.equals(student.id)){ studentDetails.student = studentItem; _studentsDetails.postValue(studentsDetailsList); } } } } }
每次任意一个函数调用成功时,ListAdapter就会提交不完整或完整的数据(但数据完整时,Adapter无法更新所有条目)
LiveData监听Observer代码
viewModel.studentsDetails.observe(getViewLifecycleOwner(), new Observer<List<StudentDetails>>() { @Override public void onChanged(List<StudentDetails> students) { // Submitting the list to the recycler view adapter studentsAdapter.submitList(students); Log.e("observed", students.toString()); if (students.isEmpty()){ binding.containerNoData.setVisibility(VISIBLE); }else{ binding.containerNoData.setVisibility(View.INVISIBLE); } } });
ListAdapter的DiffUtil代码
new DiffUtil.ItemCallback<StudentDetails>() { @Override public boolean areItemsTheSame(@NonNull StudentDetails oldItem, @NonNull StudentDetails newItem) { return oldItem.id.equals(newItem.id); } @Override public boolean areContentsTheSame(@NonNull StudentDetails oldItem, @NonNull StudentDetails newItem) { return newItem.equals(oldItem) && newItem.toString().equals(oldItem.toString()); } });
注意: 日志显示观测到的数据是完全正确的
ViewModel类完整代码
@HiltViewModel public class StudentsViewModel extends ViewModel { private StudentsRepository repository; private final MutableLiveData<Boolean> _uiState = new MutableLiveData<>(true); private final MutableLiveData<String> _error = new MutableLiveData<>(""); public LiveData<Boolean> uiState = _uiState; public LiveData<String> error = _error; private final MutableLiveData<List<StudentDetails>> _studentsDetails = new MutableLiveData<>(); public LiveData<List<StudentDetails>> studentsDetails = _studentsDetails; private List<StudentDetails> studentsDetailsList = new ArrayList<>(); private List<Student> students = new ArrayList<>(); @Inject StudentsViewModel(StudentsRepository repository){ this.repository = repository; } public void getAllStudents() { students = new ArrayList<>(); studentsDetailsList = new ArrayList<>(); _studentsDetails.postValue(studentsDetailsList); repository.getData(repository.getAllStudents(), null, new OnDataStateListener() { @Override public void onStart() { _uiState.postValue(true); } @Override public void onFailure(String exception) { _uiState.postValue(false); _error.postValue(exception); } @Override public void onSuccess(QuerySnapshot teachers) { List<Student> studentList = new ArrayList<>(); for (DocumentSnapshot item:teachers.getDocuments()){ Student student = item.toObject(Student.class); studentList.add(student); StudentDetails newStudent = new StudentDetails(); newStudent.studentId = student.id; studentsDetailsList.add(newStudent); } students.addAll(studentList); getStudent(); getStudentDepartment(); getStudentBatch(); getStudentUser(); } }); } private void getStudent(){ for (Student student : students){ repository.getData(null, repository.getStudent(student.id), new OnDataStateListener() { @Override public void onStart() { _uiState.postValue(true); } @Override public void onFailure(String exception) { _uiState.postValue(false); _error.postValue(exception); } @Override public void onSuccess(QuerySnapshot querySnapshot) { _uiState.postValue(false); for (DocumentSnapshot item:querySnapshot){ Student studentItem = item.toObject(Student.class); if (studentItem.id.equals(student.id)){ for (StudentDetails studentDetails:studentsDetailsList){ if (studentDetails.studentId.equals(student.id)){ studentDetails.student = studentItem; _studentsDetails.setValue(studentsDetailsList); } } } } } }); } } private void getStudentDepartment(){ for (Student student : students){ repository.getData(null, repository.getStudentDepartment(student.department), new OnDataStateListener() { @Override public void onStart() { _uiState.postValue(true); } @Override public void onFailure(String exception) { _uiState.postValue(false); _error.postValue(exception); } @Override public void onSuccess(QuerySnapshot querySnapshot) { _uiState.postValue(false); for (DocumentSnapshot item:querySnapshot){ Department department = item.toObject(Department.class); if (department.id.equals(student.department)){ for (StudentDetails studentDetails:studentsDetailsList){ if (studentDetails.studentId.equals(student.id)){ studentDetails.department = department; _studentsDetails.setValue(studentsDetailsList); } } } } } }); } } private void getStudentBatch(){ for (Student student : students){ repository.getData(null, repository.getStudentBatch(student.batch), new OnDataStateListener() { @Override public void onStart() { _uiState.postValue(true); } @Override public void onFailure(String exception) { _uiState.postValue(false); _error.postValue(exception); } @Override public void onSuccess(QuerySnapshot querySnapshot) { _uiState.postValue(false); for (DocumentSnapshot item:querySnapshot){ Batch batch = item.toObject(Batch.class); if (batch.id.equals(student.batch)){ for (StudentDetails studentDetails:studentsDetailsList){ if (studentDetails.studentId.equals(student.id)){ studentDetails.batch = batch; _studentsDetails.setValue(studentsDetailsList); } } } } } }); } } private void getStudentUser(){ for (Student student : students){ repository.getData(null, repository.getUserById(student.user), new OnDataStateListener() { @Override public void onStart() { _uiState.postValue(true); } @Override public void onFailure(String exception) { _uiState.postValue(false); _error.postValue(exception); } @Override public void onSuccess(QuerySnapshot querySnapshot) { _uiState.postValue(false); for (DocumentSnapshot item:querySnapshot){ User user = item.toObject(User.class); if (user.id.equals(student.user)){ for (StudentDetails studentDetails:studentsDetailsList){ if (studentDetails.studentId.equals(student.id)){ studentDetails.user = user; _studentsDetails.setValue(studentsDetailsList); } } } } } }); } } public void refreshTeachers() { getAllStudents(); } public void searchTeachers(String query){ List<StudentDetails> filteredList = new ArrayList<>(studentsDetailsList.stream().filter(item -> item.student.name.toLowerCase().trim().contains(query.toLowerCase().trim())).collect(Collectors.toList())); _studentsDetails.postValue(filteredList); } }
内容的提问来源于stack exchange,提问作者Abdelrahman Mahmoud Nasr
相关产品推荐
相关产品推荐

