Android 可观察到的更改后,RecycleServiceAdapter未更新

Android 可观察到的更改后,RecycleServiceAdapter未更新,android,google-cloud-firestore,android-recyclerview,viewmodel,Android,Google Cloud Firestore,Android Recyclerview,Viewmodel,我看到一个片段,它观察一个viewmodel上的列表,下面是代码: homeViewModel.getUrgentCharityList() .observe(getViewLifecycleOwner(), new Observer<List<Charity>>() { @Override public void onChanged(List<Charity> chari

我看到一个片段,它观察一个viewmodel上的列表,下面是代码:

homeViewModel.getUrgentCharityList()
            .observe(getViewLifecycleOwner(), new Observer<List<Charity>>() {
                @Override
                public void onChanged(List<Charity> charities) {
                    urgentCharityListRecyclerView.getAdapter().notifyDataSetChanged();

                    Log.d(TAG, String.format("Urgent charity list changed. %d items in list",
                            urgentCharityListRecyclerView.getAdapter().getItemCount()));
                }
            });
问题是,当第一次创建片段时,会获取列表数据,但RecyclerView不会刷新,奇怪的是,当我更改为另一个片段时,会返回RecyclerView更新

下面是我从Firestore获取数据的代码:

public void updateUrgentCharityList() {
    isUpdating.setValue(Boolean.TRUE);

    // Query all charities from Firestore
    charityRepository.getCurrentCharity().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if(task.isSuccessful()) {
                List<Charity> newUrgentCharityList = new ArrayList<Charity>();

                // Loop through query result
                for(QueryDocumentSnapshot document: task.getResult()) {
                    // Convert query result into Charity object
                    Charity charity = document.toObject(Charity.class);
                    // Add Charity object into charityList
                    newUrgentCharityList.add(charity);

                    Log.d("HomeFragment", "Charity list query successful");
                }

                urgentCharityList.setValue(newUrgentCharityList);
            }
            else {
                Log.e(TAG, "Charity list query failed");
            }

            isUpdating.setValue(Boolean.FALSE);
        }
    });
}
public void updateUrgentCharityList(){
isupdateing.setValue(Boolean.TRUE);
//从Firestore查询所有慈善机构
charityRepository.getCurrentCharity().addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
List newUrgentCharityList=newarraylist();
//循环查询结果
对于(QueryDocumentSnapshot文档:task.getResult()){
//将查询结果转换为查询对象
Charity=document.toObject(Charity.class);
//将慈善对象添加到慈善列表中
新增(慈善机构);
Log.d(“HomeFragment”,“慈善列表查询成功”);
}
setValue(newUrgentCharityList);
}
否则{
Log.e(标记“慈善列表查询失败”);
}
isupdateing.setValue(Boolean.FALSE);
}
});
}
我试着不通知适配器,但用一个新适配器替换适配器似乎可以,但我认为对于列表中的每一个更改,替换适配器不是一个好方法

我能想到的唯一问题是,因为数据获取是异步的,那么这就成了同步问题了?但是为什么要更换适配器呢


有人能在这里解释实际问题吗?

在类级别声明适配器

CharityRecyclerViewAdapter charityAdapter;
public void initializeCharityRecyclerView() {
// Urgent charity list
urgentCharityListRecyclerView = rootView.findViewById(R.id.rv_home_urgentCharityList);

LinearLayoutManager urgentLayoutManager = new LinearLayoutManager(requireContext(),
        LinearLayoutManager.HORIZONTAL, false);
urgentCharityListRecyclerView.setLayoutManager(urgentLayoutManager);
charityAdapter=new CharityRecyclerViewAdapter(requireContext(),homeViewModel.getUrgentCharityList().getValue());
urgentCharityListRecyclerView.setAdapter(charityAdapter);
}
然后在适配器类中将列表可见性从private更改为public,并在调用notifyDatasetChanged之前在observer中更新列表

homeViewModel.getUrgentCharityList()
        .observe(getViewLifecycleOwner(), new Observer<List<Charity>>() {
            @Override
            public void onChanged(List<Charity> charities) {
                charityAdapter.charities=charities;
                charityAdapter.notifyDataSetChanged();

                Log.d(TAG, String.format("Urgent charity list changed. %d items in list",
                        urgentCharityListRecyclerView.getAdapter().getItemCount()));
            }
        });
homeViewModel.getUrgentCharityList()
.observe(getViewLifecycleOwner(),new Observer()){
@凌驾
更改后的公共作废(列出慈善机构){
charityAdapter.charities=慈善机构;
charityAdapter.notifyDataSetChanged();
Log.d(标记,字符串.format(“列表已更改,列表中有%d项”),
urgentCharityListRecyclerView.getAdapter().getItemCount());
}
});

显示活动/片段中向适配器提供数据(列表)的代码。正如我在您的观察者中看到的,您没有向适配器提供更新的数据,您只是在调用NotifyDataSetChanged。@Yonatan当我初始化recyclerview时,我还设置了adapter
urgentCharityListRecyclerView.setAdapter(新的CharityRecyclerViewAdapter(RequireText(),homeViewModel.getUrgentCharityList().getValue())CharityRecylerViewAdapter扩展了哪个适配器?RecyclerView.适配器或ListAdapter@YonatanRecyclerView.Adapter
公共类CharityRecyclerViewAdapter扩展了RecyclerView.Adapter
这似乎是可行的,但这不就像观察两次一样吗?不是,它只是观察一次。您可以省略将数据传递到适配器构造函数中的列表的代码,因为我们正在观察者中设置列表。
homeViewModel.getUrgentCharityList()
        .observe(getViewLifecycleOwner(), new Observer<List<Charity>>() {
            @Override
            public void onChanged(List<Charity> charities) {
                charityAdapter.charities=charities;
                charityAdapter.notifyDataSetChanged();

                Log.d(TAG, String.format("Urgent charity list changed. %d items in list",
                        urgentCharityListRecyclerView.getAdapter().getItemCount()));
            }
        });