9
votes

L'activité ne peut pas être castée vers LifecycleOwner

Mon MainActivity étend AppCompatActivity

    public class WebsiteViewModel extends AndroidViewModel {
    private WebsiteRepository repository;
    private LiveData<List<Website>> allWebsites;

    public WebsiteViewModel(@NonNull Application application) {
        super(application);
        repository = new WebsiteRepository(application);
        allWebsites = repository.getAllWebsites();
    }

    public void insert(Website website) {
        repository.insert(website);
    }

    public void update(Website website) {
        repository.update(website);
    }

    public void delete(Website website) {
        repository.delete(website);
    }

    public void deleteAllWebsites() {
        repository.deleteAllWebsites();
    }

    public LiveData<List<Website>> getAllWebsites() {
        return allWebsites;
    }
}

L'erreur à laquelle je suis confronté est "erreur: types incompatibles: MainActivity ne peut pas être converti en LifecycleOwner . "

Le WebsiteViewModel est

public class MainActivity extends AppCompatActivity {
private WebsiteViewModel websiteViewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


      setContentView(R.layout.activity_main);

        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(true);

        final WebsiteAdapter adapter = new WebsiteAdapter();


        this.websiteViewModel = ViewModelProviders.of(this).get(WebsiteViewModel.class);

        this.websiteViewModel.getAllWebsites().observe(this, new Observer<List<Website>>() {
            @Override
            public void onChanged(@Nullable List<Website> websites) {
                adapter.setWebsites(websites);
            }
        });
        recyclerView.setAdapter(adapter);
    }
}

Dans mon autre projet, j'utilise un Fragment code > plutôt qu'une Activité à convertir en propriétaire du cycle de vie, et ce projet s'exécute sans cette erreur. Cependant, je copie depuis https: // codinginflow.com/tutorials/android/room-viewmodel-livedata-recyclerview-mvvm/part-6-recyclerview-adapter , mais je ne sais pas pourquoi je rencontre ce problème. J'utilise androidx

Si j'ajoute des implémentations LifecycleOwner dans MainActivity alors j'obtiens l'erreur "java.lang.NoSuchMethodError: No super method getLifecycle () Landroidx / lifecycle / Lifecycle; dans la classe Landroidx / core / app / ComponentActivity ; ou ses super classes (la déclaration de 'androidx.core.app.ComponentActivity' apparaît dans /data/app/com.example.project-2/split_lib_dependencies_apk.apk) "


6 commentaires

À première vue, le code semble devoir fonctionner correctement, pouvez-vous partager l'exception complète?


cela peut aider: stackoverflow.com/questions/46465056/…


@ y.allam, comme vous pouvez le voir, mon activité principale étend la compatibilité des applications qui devrait être un propriétaire du cycle de vie afaik


@GilGoldzweig "Erreur: types incompatibles: MainActivity ne peut pas être converti en LifecycleOwner"


Cela ressemble à l'un de ces problèmes qu'un nettoyage et une reconstruction résoudraient


@GilGoldzweig J'ai copié à nouveau mon projet dans un nouveau projet et ce faisant, j'ai découvert la mise à jour de l'implémentation vers 'androidx.appcompat: appcompat: 1.1.0-alpha01' a corrigé le problème :)


3 Réponses :


18
votes

Essayez de mettre à jour votre dépendance AppCompat vers la plus récente. J'ai mis à jour de 'androidx.appcompat: appcompat: 1.0.0-alpha1' à 'androidx.appcompat: appcompat: 1.1.0-alpha03' et il l'a corrigé


0 commentaires

1
votes

Si vous trouvez cela maintenant, c'est peut-être parce que vous avez ajouté une version préliminaire de androidx.recyclerview: recyclerview: 1.1.0- * , qui contient apparemment androidx en amont noyau pour lequel Activity implémentait LifecycleOwner .


0 commentaires

3
votes

implémentation 'androidx.constraintlayout: constraintlayout: 2.0.0-beta2' provoquant également le problème de rétrogradation vers

implémentation 'androidx.constraintlayout: constraintlayout: 2.0.0-beta1' pour éviter l'erreur


0 commentaires