Android 可观察到的更改后,RecycleServiceAdapter未更新
我看到一个片段,它观察一个viewmodel上的列表,下面是代码: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
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时,我还设置了adapterurgentCharityListRecyclerView.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()));
}
});