Как создать экземпляр ViewModel с Bundle в MainActivity? - PullRequest
0 голосов
/ 01 апреля 2020

Там ColorViewModel с Связкой , это для восстановления данных:

public class ColorViewModel extends ViewModel {
private static final String STATE_NUMBERS = "numbers";
ArrayList<Integer> numbers;

ColorViewModel(Bundle state) {
    if (state == null) {
        numbers = buildItems();
    }
    else {
        numbers = state.getIntegerArrayList(STATE_NUMBERS);
    }
}

void onSaveInstanceState(Bundle state) {
    state.putIntegerArrayList(STATE_NUMBERS, numbers);
}

void refresh() {
    numbers = buildItems();
}

private ArrayList<Integer> buildItems() {
    Random random = new Random();
    ArrayList<Integer> result = new ArrayList<>(25);
    for (int i = 0; i < 25; i++) {
        result.add(random.nextInt());
    }
    return result;
}

}

И я называю это ColorViewModel в MainActivity . Я пытался с SavedStateHandle (он прокомментирован выше vm), но не существует метода onSaveInstanceState, такого как Bundle, который сохранял бы данные, когда активность уничтожена.

public class  MainActivity extends AppCompatActivity {
ColorViewAdapter adapter;
ColorViewModel vm;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar tb = findViewById(R.id.toolbar);
    setSupportActionBar(tb);
    RecyclerView items = findViewById(R.id.items);
    adapter = new ColorViewAdapter(getLayoutInflater());
    //final ViewModelProvider.Factory vmFactory = new SavedStateViewModelFactory(getApplication(), this);
    vm = new ViewModelProvider(this).get(ColorViewModel.class);
    adapter.submitList(vm.numbers);
    items.setLayoutManager(new LinearLayoutManager(this));
    items.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
    items.setAdapter(adapter);
}

Затем при запуске приложения отображается следующее: enter image description here

enter image description here

Журнал включает в себя следующее:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mycompany.twoactivities, PID: 6685
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mycompany.twoactivities/com.mycompany.twoactivities.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.mycompany.twoactivities.ColorViewModel
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
 Caused by: java.lang.RuntimeException: Cannot create an instance of class com.mycompany.twoactivities.ColorViewModel
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278)
    at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:106)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
    at com.mycompany.twoactivities.MainActivity.onCreate(MainActivity.java:35)
    at android.app.Activity.performCreate(Activity.java:6975)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
    at android.os.Handler.dispatchMessage(Handler.java:105) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6541) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
 Caused by: java.lang.InstantiationException: java.lang.Class<com.mycompany.twoactivities.ColorViewModel> has no zero argument constructor
    at java.lang.Class.newInstance(Native Method)
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:219)
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278) 
    at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:106) 
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185) 
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150) 
    at com.mycompany.twoactivities.MainActivity.onCreate(MainActivity.java:35) 
    at android.app.Activity.performCreate(Activity.java:6975) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
    at android.os.Handler.dispatchMessage(Handler.java:105) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6541) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...