0

Aus meiner Sicht ist die ViewModelFactory-Klasse obligatorisch, wenn Ihre ViewModel-Klasse Parameter in ihrem Konstruktor hat. Wie kann ich dann meine ViewModelFactory-Klasse in meiner Aktivität initialisieren, abgesehen von Dependency Injection? Unten ist mein Factory-KlasseInitialize ViewModelFactory

public class ViewModelFactory implements ViewModelProvider.Factory { 
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators; 


public ViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) { 
    this.creators = creators; 
} 

@SuppressWarnings("unchecked") 
@Override 
public <T extends ViewModel> T create(Class<T> modelClass) { 
    Provider<? extends ViewModel> creator = creators.get(modelClass); 
    if (creator == null) { 
     for (Map.Entry<Class<? extends ViewModel>, Provider<ViewModel>> entry : creators.entrySet()) { 
      if (modelClass.isAssignableFrom(entry.getKey())) { 
       creator = entry.getValue(); 
       break; 
      } 
     } 
    } 
    if (creator == null) { 
     throw new IllegalArgumentException("unknown model class " + modelClass); 
    } 
    try { 
     return (T) creator.get(); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
    } 
} 

Und hier ist meine Aktivitätsklasse

public class RestaurantListActivity extends AppCompatActivity implements LifecycleRegistryOwner { 

private LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_restaurant_list); 
    Toolbar toolbar = findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    //How do I initialize this? 
    ViewModelFactory mViewModelFactory; 

    MyViewModel viewModel = ViewModelProviders.of(this,mViewModelFactory).get(MyViewModel.class); 
    viewModel.init(); 

    FloatingActionButton fab = findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 

    } 
} 

Antwort

0

können Sie, dass diese Art und Weise tun:

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_activity); 

    ViewModelProvider.Factory factory = new ViewModelProvider.Factory() { 
     @Override 
     public <T extends ViewModel> T create(Class<T> modelClass) { 
      if (modelClass.equals(SomeObject.class)) { 
       // instantiate `someObject` 
       return someObject; 
      } else if (modelClass.equals(SomeOtherObject.class)) { 
       // instantiate `someOtherObject` 
       return someOtherObject; 
      } else { 
       return ...; 
      } 

     } 
    } 
}