Java 无法在Android中实例化ViewModel
我试图在我的应用程序中实现MVVM设计模式。我已经创建了viewmodel和repository类,但当我试图在我的MainActivity中实例化viewmodel时,它会在下面的行中实例化时在Java 无法在Android中实例化ViewModel,java,android,mvvm,android-livedata,android-viewmodel,Java,Android,Mvvm,Android Livedata,Android Viewmodel,我试图在我的应用程序中实现MVVM设计模式。我已经创建了viewmodel和repository类,但当我试图在我的MainActivity中实例化viewmodel时,它会在下面的行中实例化时在MainActivity下方显示错误红线 pdfViewModel=newviewmodelprovider(MainActivity.this.get)(pdfViewModel.class) 下面是我的代码: MainActivity.java public class MainActivity e
MainActivity
下方显示错误红线
pdfViewModel=newviewmodelprovider(MainActivity.this.get)(pdfViewModel.class)代码>
下面是我的代码:
MainActivity.java
public class MainActivity extends AppCompatActivity {
PdfViewModel pdfViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pdfViewModel = new ViewModelProvider(MainActivity.this).get(PdfViewModel.class);
}
}
public class PdfViewModel extends AndroidViewModel {
private PdfRepository pdfRepository;
public PdfViewModel(@NonNull Application application) {
super(application);
pdfRepository = new PdfRepository(application);
}
public LiveData<List<Pdfs>> getAllPdfs(){
return pdfRepository.getMutableLiveData();
}
}
public class PdfRepository {
private ArrayList<Pdfs> list = new ArrayList<>();
private MutableLiveData<List<Pdfs>> mutableLiveData = new MutableLiveData<>();
private Application application;
public PdfRepository(Application application){
this.application = application;
}
public MutableLiveData<List<Pdfs>> getMutableLiveData(){
SharedPreferences preferences = application.getSharedPreferences("Credentials", Context.MODE_PRIVATE);
String email = preferences.getString("email",null);
Retrofit retrofit = RetrofitClient.getInstance();
ApiService apiService = retrofit.create(ApiService.class);
Call<List<Pdfs>> call = apiService.getFiles(email);
call.enqueue(new Callback<List<Pdfs>>() {
@Override
public void onResponse(Call<List<Pdfs>> call, Response<List<Pdfs>> response) {
if(response.body() != null){
list = (ArrayList<Pdfs>) response.body();
mutableLiveData.setValue(list);
}
}
@Override
public void onFailure(Call<List<Pdfs>> call, Throwable t) {
TastyToast.makeText(application,t.getMessage(),TastyToast.LENGTH_SHORT,TastyToast.ERROR).show();
}
});
return mutableLiveData;
}
}
PdfViewModel.java
public class MainActivity extends AppCompatActivity {
PdfViewModel pdfViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pdfViewModel = new ViewModelProvider(MainActivity.this).get(PdfViewModel.class);
}
}
public class PdfViewModel extends AndroidViewModel {
private PdfRepository pdfRepository;
public PdfViewModel(@NonNull Application application) {
super(application);
pdfRepository = new PdfRepository(application);
}
public LiveData<List<Pdfs>> getAllPdfs(){
return pdfRepository.getMutableLiveData();
}
}
public class PdfRepository {
private ArrayList<Pdfs> list = new ArrayList<>();
private MutableLiveData<List<Pdfs>> mutableLiveData = new MutableLiveData<>();
private Application application;
public PdfRepository(Application application){
this.application = application;
}
public MutableLiveData<List<Pdfs>> getMutableLiveData(){
SharedPreferences preferences = application.getSharedPreferences("Credentials", Context.MODE_PRIVATE);
String email = preferences.getString("email",null);
Retrofit retrofit = RetrofitClient.getInstance();
ApiService apiService = retrofit.create(ApiService.class);
Call<List<Pdfs>> call = apiService.getFiles(email);
call.enqueue(new Callback<List<Pdfs>>() {
@Override
public void onResponse(Call<List<Pdfs>> call, Response<List<Pdfs>> response) {
if(response.body() != null){
list = (ArrayList<Pdfs>) response.body();
mutableLiveData.setValue(list);
}
}
@Override
public void onFailure(Call<List<Pdfs>> call, Throwable t) {
TastyToast.makeText(application,t.getMessage(),TastyToast.LENGTH_SHORT,TastyToast.ERROR).show();
}
});
return mutableLiveData;
}
}
公共类PdfViewModel扩展了AndroidViewModel{
私人储蓄;
公共PdfViewModel(@NonNull应用程序){
超级(应用);
Pdfrespository=新的Pdfrespository(应用程序);
}
公共LiveData getAllPdfs(){
返回pdfRepository.getMutableLiveData();
}
}
pdfreposition.java
public class MainActivity extends AppCompatActivity {
PdfViewModel pdfViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pdfViewModel = new ViewModelProvider(MainActivity.this).get(PdfViewModel.class);
}
}
public class PdfViewModel extends AndroidViewModel {
private PdfRepository pdfRepository;
public PdfViewModel(@NonNull Application application) {
super(application);
pdfRepository = new PdfRepository(application);
}
public LiveData<List<Pdfs>> getAllPdfs(){
return pdfRepository.getMutableLiveData();
}
}
public class PdfRepository {
private ArrayList<Pdfs> list = new ArrayList<>();
private MutableLiveData<List<Pdfs>> mutableLiveData = new MutableLiveData<>();
private Application application;
public PdfRepository(Application application){
this.application = application;
}
public MutableLiveData<List<Pdfs>> getMutableLiveData(){
SharedPreferences preferences = application.getSharedPreferences("Credentials", Context.MODE_PRIVATE);
String email = preferences.getString("email",null);
Retrofit retrofit = RetrofitClient.getInstance();
ApiService apiService = retrofit.create(ApiService.class);
Call<List<Pdfs>> call = apiService.getFiles(email);
call.enqueue(new Callback<List<Pdfs>>() {
@Override
public void onResponse(Call<List<Pdfs>> call, Response<List<Pdfs>> response) {
if(response.body() != null){
list = (ArrayList<Pdfs>) response.body();
mutableLiveData.setValue(list);
}
}
@Override
public void onFailure(Call<List<Pdfs>> call, Throwable t) {
TastyToast.makeText(application,t.getMessage(),TastyToast.LENGTH_SHORT,TastyToast.ERROR).show();
}
});
return mutableLiveData;
}
}
公共类PDF存储{
private ArrayList list=new ArrayList();
私有MutableLiveData MutableLiveData=新的MutableLiveData();
私人申请;
公共PDF存储(应用程序){
这个应用程序=应用程序;
}
公共MutableLiveData getMutableLiveData(){
SharedReferences首选项=application.getSharedReferences(“凭证”,Context.MODE\u PRIVATE);
字符串email=preferences.getString(“email”,null);
Refundation-Refundation=RefundationClient.getInstance();
ApiService ApiService=reformation.create(ApiService.class);
Call Call=apiService.getFiles(电子邮件);
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.body()!=null){
list=(ArrayList)response.body();
mutableLiveData.setValue(列表);
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
makeText(应用程序,t.getMessage(),TastyToast.LENGTH\u SHORT,TastyToast.ERROR).show();
}
});
返回可变的livedata;
}
}
上述代码中需要更正什么?您的代码正在尝试创建类ViewModelProvider
(使用new
关键字)的新实例,这不是实例化ViewModel的正确方法
在main活动中
,而不是:
pdfViewModel = new ViewModelProvider(MainActivity.this).get(PdfViewModel.class);
尝试:
请注意,正确的类是ViewModelProviders
(末尾有一个“s”),您需要调用的静态方法,而不是使用new
创建它的新实例。如果无法导入该类,请确保已将依赖项“androidx.lifecycle:lifecycle extensions:2.2.0”添加到app/build.gradle
为了使您的代码更加清晰,我建议您学习Kotlin KTX方法viewModels
,如前所述。不过,您需要使用Kotlin。错误说明了什么?没有显示任何内容,只有一条红线。您可以将main活动替换为this
。此仅替换为this
。您编译了代码吗?你有编译错误吗?如果是,请提供错误。a本机您可以单击红线并观察出现的红色灯泡。然后单击灯泡寻找可能的解决方案。当更改为时,它的语句“无法解析构造函数”ViewModelProviders
没有显示在建议中,而是显示了ViewModelProvider
。尝试将“androidx.lifecycle:lifecycle extensions:2.2.0”添加到模块build.gradle中。