Java 使用ViewModelProviders无法正确获取数据?
我正在尝试使用MVVM,我正在尝试获取ViewModel中的数据(通常来自服务)并将它们设置为我的活动,但它似乎不起作用,当我尝试使用ContractModel的简单ArrayList并将其添加到适配器时,一切都很好,但当我尝试调用ViewModel时,一切都停止了 我正在学习一门课程,做的事情和我做的一样,但结果却不一样 这是我的主要活动:Java 使用ViewModelProviders无法正确获取数据?,java,android,viewmodel,android-adapter,Java,Android,Viewmodel,Android Adapter,我正在尝试使用MVVM,我正在尝试获取ViewModel中的数据(通常来自服务)并将它们设置为我的活动,但它似乎不起作用,当我尝试使用ContractModel的简单ArrayList并将其添加到适配器时,一切都很好,但当我尝试调用ViewModel时,一切都停止了 我正在学习一门课程,做的事情和我做的一样,但结果却不一样 这是我的主要活动: public class MainActivity extends AppCompatActivity { ContractsListViewM
public class MainActivity extends AppCompatActivity {
ContractsListViewModel contractsListViewModel;
@BindView(R.id.contractList)
RecyclerView contractList;
RecyclerView.Adapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
contractList.setLayoutManager(new LinearLayoutManager(this));
contractsListViewModel = ViewModelProviders.of(this).get(ContractsListViewModel.class);
contractsListViewModel.call();
adapter = new ContractListAdapter(this, contractsListViewModel.contractList.getValue());
contractList.setAdapter(adapter);
}
}
这是我的ViewModel:
public class ContractsListViewModel extends ViewModel {
public MutableLiveData<List<ContractModel>> contractList;
MutableLiveData<Boolean> isLoading;
MutableLiveData<Boolean> error;
public void call(){
fetchContracts();
}
public void fetchContracts(){
ContractModel contractModel = new ContractModel(1, "hfdfd", "h");
ContractModel contractModel1 = new ContractModel(1, "hfdffddd", "h");
ContractModel contractModel2 = new ContractModel(1, "hdffd", "j");
ContractModel contractModel3 = new ContractModel(1, "hdffdfd", "h");
List<ContractModel> list = new ArrayList<ContractModel>();
list.add(...allofthem);
contractList.setValue(list);
}
}
公共类契约ListViewModel扩展了ViewModel{
公共可变LiveData合同列表;
可变LiveData isLoading;
可变数据错误;
公开作废通知(){
获取合同();
}
公共合同(){
ContractModel ContractModel=新的ContractModel(1,“hfdfd”,“h”);
ContractModel contractModel1=新的ContractModel(1,“hfdffddd”,“h”);
ContractModel contractModel2=新的ContractModel(1,“hdffd”,“j”);
ContractModel contractModel3=新的ContractModel(1,“hdffdfd”,“h”);
列表=新的ArrayList();
列表。添加(…allofthem);
contractList.setValue(列表);
}
}
我的适配器工作正常,因为它与我上面提到的ArrayList一起工作。
但这里有:
public class ContractListAdapter extends RecyclerView.Adapter<ContractListAdapter.ContractViewHolder> {
List<ContractModel> contracts;
Context context;
public ContractListAdapter(Context context, List<ContractModel> contracts){
this.context = context;
this.contracts = contracts;
}
@NonNull
@Override
public ContractViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.contrat, parent, false);
return new ContractViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ContractViewHolder holder, int position) {
holder.bind(contracts.get(position));
}
@Override
public int getItemCount() {
return this.contracts.size();
}
public class ContractViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.courtier)
TextView courtier;
public ContractViewHolder(@NonNull View view){
super(view);
ButterKnife.bind(this, view);
}
public void bind(ContractModel contractModel){
courtier.setText(contractModel.getCourtier());
}
}
}
公共类ContractListAdapter扩展了RecyclerView.Adapter{
列出合同清单;
语境;
公共契约列表适配器(上下文上下文,列表契约){
this.context=上下文;
本合同=合同;
}
@非空
@凌驾
public ContractViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
View=LayoutInflater.from(parent.getContext()).flate(R.layout.contrat,parent,false);
返回新的ContractViewHolder(视图);
}
@凌驾
BindViewHolder上的公共无效(@NonNull ContractViewHolder,int位置){
持有人。绑定(合同。获取(位置));
}
@凌驾
public int getItemCount(){
返回此.contracts.size();
}
公共类ContractViewHolder扩展了RecyclerView.ViewHolder{
@宾德维尤(R.id.朝臣)
文本视图朝臣;
public ContractViewHolder(@NonNull视图){
超级(视图);
ButterKnife.bind(这个,视图);
}
公共无效绑定(ContractModel ContractModel){
courtier.setText(contractModel.getCourtier());
}
}
}
任何帮助都将不胜感激。我认为您代码中的问题是,当响应到达并传递给适配器时,列表的引用会一次又一次地更改,尽管您尚未发布适配器的代码,但我可以假设您正在覆盖适配器中的列表引用,您应该做的是在启动后在适配器中保留一个ArrayList,当您将新列表传递给适配器时,在现有列表中添加项目并调用notifyDataSetChanged(),这样适配器将具有对列表的旧引用,并将在recycler视图中刷新新项目。 表征码
Class MyAdapter extends RecycelerviewAdapter{
private List<ContractModel> globalList = new ArrayList();
public ( List<ContractModel> newlist){
globalList.addAll(newlist)
}
public updateList(List<ContractModel> newlist){
globalList.addAll(newlist)
}
我认为您代码中的问题是,当响应到达并传递给适配器时,列表的引用一次又一次地发生变化,尽管您尚未发布适配器的代码,但我可以假设您正在覆盖适配器中的列表引用,您应该做的是在启动后在适配器中保留一个ArrayList,将新列表传递给适配器时,在现有列表中添加项目并调用notifyDataSetChanged(),这样适配器将具有对列表的旧引用,并将刷新回收器视图中的新项目。 表征码
Class MyAdapter extends RecycelerviewAdapter{
private List<ContractModel> globalList = new ArrayList();
public ( List<ContractModel> newlist){
globalList.addAll(newlist)
}
public updateList(List<ContractModel> newlist){
globalList.addAll(newlist)
}
快速修复
public MutableLiveData<List<ContractModel>> contractList=new MutableLiveData<>();
MainActivityonCreate()
检查以了解setValue和postValue之间的差异
public MutableLiveData<List<ContractModel>> contractList=new MutableLiveData<>();
MainActivityonCreate()
检查以了解setValue和postValue之间的差异您现在可以检查我的适配器吗?是的,您是对的,我会考虑这一点。您现在可以检查我的适配器吗?是的,您是对的,我会考虑这一点
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
contractList.setLayoutManager(new LinearLayoutManager(this));
contractsListViewModel = ViewModelProviders.of(this).get(ContractsListViewModel.class);
contractsListViewModel.call();
contractsListViewModel.contractList.observe(this,contractModels -> {
adapter = new ContractListAdapter(MainActivity.this, contractModels);
contractList.setAdapter(adapter);
});
}