ViewModel не наблюдается AppCompatActivity - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь использовать ViewModel вместе в моем EarthquakeActivity, но продолжаю получать эту ошибку:

Wrong 1st argument type. Found: 'com.example.android.quakereport.EarthquakeActivity', required: 'androidx.lifecycle.LifecycleOwner'

Это когда я пытаюсь сделать

mainViewModel.getEarthquakeData().observe(this, new Observer<List<Earthquake>>() {
        @Override
        public void onChanged(List<Earthquake> earthquakes) {
                // do something
        }
    });

this, которое является действием, возвращает ошибку.

Я прочитал здесь , что AppCompatActivity уже расширяет LifecycleOwner, и это именно то, что я использую.Что здесь не так?В любом другом учебнике этой проблемы нет.

Мой EarthquakeActivity.java:

package com.example.android.quakereport;

import android.arch.lifecycle.ViewModelProviders;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

import POJO.Earthquake;
import POJO.RootEarthquakeResponse;
import androidx.lifecycle.Observer;
import retrofit2.Call;


public class EarthquakeActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private RecyclerView.Adapter adapter;
    private LinearLayoutManager  layoutManager;

    public static final String LOG_TAG = EarthquakeActivity.class.getName();

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

        // Create a fake list of earthquake locations.
        final ArrayList<Earthquake> earthquakes = getEarthquakes();

        setupRecyclerView(earthquakes); // set up recycler view

        MainViewModel mainViewModel = ViewModelProviders.of(this).get(MainViewModel.class);
        mainViewModel.getEarthquakeData().observe(this, new Observer<List<Earthquake>>() {
            @Override
            public void onChanged(List<Earthquake> earthquakes) {
                    // do something
            }
        });

    }

    private void setupRecyclerView(ArrayList<Earthquake> earthquakes){
        // set up recyclerview
    }
}

Мой MainViewModel:

package com.example.android.quakereport;

import android.app.Application;
import android.arch.lifecycle.AndroidViewModel;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

import POJO.Earthquake;
import POJO.Feature;
import POJO.RootEarthquakeResponse;
import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MainViewModel extends AndroidViewModel {

    private MutableLiveData<List<Earthquake>> earthquakeLiveData;
    private String LOG_TAG = MainViewModel.class.getName();

    public MainViewModel(@NonNull Application application) {
        super(application);
//        earthquakeLiveData = new EarthquakeLiveData();
    }

    public LiveData<List<Earthquake>> getEarthquakeData(){
        if (earthquakeLiveData == null){
            earthquakeLiveData = new MutableLiveData<>();
            loadEarthquakes();
        }

        return earthquakeLiveData;
    }

    private void loadEarthquakes(){
        EarthquakeService earthquakeService = EarthquakeServiceGenerator.createService(EarthquakeService.class);

        Call<RootEarthquakeResponse> call = earthquakeService.getEarthquakes("geojson", "time", 6, 10);

        call.enqueue(new Callback<RootEarthquakeResponse>() {
            @Override
            public void onResponse(Call<RootEarthquakeResponse> call, Response<RootEarthquakeResponse> response) {
                List<Earthquake> earthquakes = new ArrayList<>();
                for (Feature f: response.body().getFeatures()) {
                    earthquakes.add(f.getEarthquake());
                }

                earthquakeLiveData.setValue(earthquakes);
                Log.d(LOG_TAG, "Successful!");
                Log.d(LOG_TAG, response.body().toString());
            }

            @Override
            public void onFailure(Call<RootEarthquakeResponse> call, Throwable t) {
                Log.e(LOG_TAG, call.request().toString()); // check request if failed
                Log.e(LOG_TAG, t.toString()); // check error
            }
        });
    }
}

Вот мои зависимости gradle:

implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support:recyclerview-v7:26.1.0'
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'

implementation "androidx.lifecycle:lifecycle-viewmodel:2.0.0" // use -ktx for Kotlin
// alternatively - just LiveData
implementation "androidx.lifecycle:lifecycle-livedata:2.0.0"
implementation "android.arch.lifecycle:extensions:1.1.1"

Нужно ли мне иметь дело с переопределением жизненных циклов, или что-то не так с моими зависимостями?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Импорт AppCompatActivity из библиотеки AndroidX:

import androidx.appcompat.app.AppCompatActivity
0 голосов
/ 12 декабря 2018

Вы используете ViewModel из библиотеки AndroidX, а также используете библиотеку поддержки для AppCompatActivity.

Перенесите свою библиотеку поддержки в AndroidX, чтобы решить вашу проблему.

...