Java 使用ViewModelProviders无法正确获取数据?

Java 使用ViewModelProviders无法正确获取数据?,java,android,viewmodel,android-adapter,Java,Android,Viewmodel,Android Adapter,我正在尝试使用MVVM,我正在尝试获取ViewModel中的数据(通常来自服务)并将它们设置为我的活动,但它似乎不起作用,当我尝试使用ContractModel的简单ArrayList并将其添加到适配器时,一切都很好,但当我尝试调用ViewModel时,一切都停止了 我正在学习一门课程,做的事情和我做的一样,但结果却不一样 这是我的主要活动: public class MainActivity extends AppCompatActivity { ContractsListViewM

我正在尝试使用MVVM,我正在尝试获取ViewModel中的数据(通常来自服务)并将它们设置为我的活动,但它似乎不起作用,当我尝试使用ContractModel的简单ArrayList并将其添加到适配器时,一切都很好,但当我尝试调用ViewModel时,一切都停止了

我正在学习一门课程,做的事情和我做的一样,但结果却不一样

这是我的主要活动:

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);
    });

 }