我正在从Cloud Firestore提取数据,并使用MVVM架构和LiveData在recyclerview中显示。当我观察viewmodel的变化并通知适配器有关数据集的变化时,更改的数据不会在recyclerview中更新。
您在代码中看到任何错误吗?
HomeActivity.java
public class HomeActivity extends AppCompatActivity {
RecyclerView recyclerView;
StandardPlansAdapter adapter;
HomeActivityViewModel viewModel;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerViewHome);
viewModel = new ViewModelProvider(this).get(HomeActivityViewModel.class);
viewModel.getStandardPlans().observe(this, (Observer<List<Plan>>) plans -> adapter.notifyDataSetChanged());
adapter = new StandardPlansAdapter(viewModel.getStandardPlans().getValue());
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
}
}
StandardPlansAdapter.java
public class StandardPlansAdapter extends RecyclerView.Adapter<StandardPlansAdapter.StandardPlansViewHolder> {
private ArrayList<Plan> standardPlans;
public StandardPlansAdapter(ArrayList<Plan> standardPlans) {
this.standardPlans = standardPlans;
}
@NonNull
@Override
public StandardPlansViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.home_rv_layout, parent, false);
return new StandardPlansViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull StandardPlansViewHolder holder, int position) {
Plan plan = standardPlans.get(position);
holder.textView.setText(plan.getName());
}
@Override
public int getItemCount() {
return standardPlans.size();
}
class StandardPlansViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public StandardPlansViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tvPlanName);
}
}
}
HomeActivityViewModel.java
public class HomeActivityViewModel extends ViewModel {
private StandardPlansRepository repository;
private MutableLiveData<ArrayList<Plan>> standardPlans;
public HomeActivityViewModel() {
super();
repository = StandardPlansRepository.getInstance();
standardPlans = repository.getStandardPlans();
}
public LiveData<ArrayList<Plan>> getStandardPlans() {
return standardPlans;
}
}
您Observer
正在调用notifyDataSetChanged
而不更新实际数据集,该数据集是standardPlans
中的私有成员StandardPlansAdapter
向适配器添加公共setStandardPlans
方法:
public class StandardPlansAdapter extends RecyclerView.Adapter<StandardPlansAdapter.StandardPlansViewHolder> {
public setStandardPlans(ArrayList<Plan> standardPlans) {
this.standardPlans = standardPlans;
}
}
然后在您的Observer
回调中进行通知之前先调用setter
viewModel.getStandardPlans().observe(this, (Observer<List<Plan>>) plans -> {
adapter.setStandardPlans(plans); //You update the dataset first
adapter.notifyDataSetChanged(); //And then notify the adapter of the update
})