You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 07:45:56