3

私はAndroid Support Library 26.1.0を使用しています。これらは、アプリケーション・モジュール内の依存関係している -AppCompatActivityがLifecycleOwnerを実装していません

implementation "android.arch.lifecycle:runtime:1.0.0" 
implementation "android.arch.lifecycle:extensions:1.0.0-beta1" 
implementation "android.arch.persistence.room:rxjava2:1.0.0-beta1" 
implementation "android.arch.lifecycle:common-java8:1.0.0-beta1" 
annotationProcessor "android.arch.lifecycle:compiler:1.0.0-beta1" 

しかし、私は以下のようなビューモデルを使用しようとしています -

mUserViewModel.getUsers().observe(this, 
      (Observer<Resource<List<UserView>>>) listResource -> { 
       if(listResource != null){ 
        this.handleDataState(listResource.status, listResource.data, listResource.message); 
       } 
      }); 

それはthisでエラーを示しているとエラーメッセージがWrong first argument type Found: packagename.BrowseActivity, required: android.arch.lifecycle.LifecycleOwnerです。 (サポートライブラリのバージョンはすでにLifecycleOwnerを実装している26.1+ですが)

私はsampleで見つけたLifecycleRegistryOwnerを実装しようとしましたが、これも動作しません。親切にソリューションを提案し、私が何か悪いことをしているかどうかを教えてください。

編集1 - これはActivityクラスである

import android.arch.lifecycle.Observer; 
import android.arch.lifecycle.ViewModelProviders; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.View; 
import android.widget.ProgressBar; 

import com.github.amitkma.boilerplate.app.R; 
import com.github.amitkma.boilerplate.app.mapper.UserMapper; 
import com.github.amitkma.boilerplate.app.model.UserModel; 
import com.github.amitkma.boilerplate.app.ui.widget.EmptyView; 
import com.github.amitkma.boilerplate.app.ui.widget.ErrorView; 
import com.github.amitkma.boilerplate.presentation.data.Resource; 
import com.github.amitkma.boilerplate.presentation.data.ResourceState; 
import com.github.amitkma.boilerplate.presentation.factory.ViewModelFactory; 
import com.github.amitkma.boilerplate.presentation.viewmodel.UserViewModel; 
import com.github.amitkma.boilerplate.presentation.vo.UserView; 

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

import javax.inject.Inject; 

import dagger.android.AndroidInjection; 

public class BrowseActivity extends AppCompatActivity { 

    @Inject 
    UserAdapter mUserAdapter; 
    @Inject 
    UserMapper mUserMapper; 
    @Inject 
    ViewModelFactory mViewModelFactory; 
    private UserViewModel mUserViewModel; 

    private RecyclerView mRecyclerView; 
    private ProgressBar mProgressBar; 
    private ErrorView mErrorView; 
    private EmptyView mEmptyView; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     AndroidInjection.inject(this); 
     setContentView(R.layout.activity_browse); 
     mUserViewModel = ViewModelProviders.of(this, mViewModelFactory) 
      .get(UserViewModel.class); 

     mRecyclerView = findViewById(R.id.recycler_browse); 
     mProgressBar = findViewById(R.id.progress); 
     mEmptyView = findViewById(R.id.view_empty); 
     mErrorView = findViewById(R.id.view_error); 

     setupBrowseRecycler(); 
     setupViewListeners(); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     mUserViewModel.getUsers().observe(this, 
      (Observer<Resource<List<UserView>>>) listResource -> { 
       if(listResource != null){ 
        this.handleDataState(listResource.status, listResource.data, listResource.message); 
       } 
      }); 
    } 
    .... 
} 

これは、あなたはもうこれを実装する必要はありませんのViewModelクラス

import android.arch.lifecycle.LiveData; 
import android.arch.lifecycle.MutableLiveData; 
import android.arch.lifecycle.ViewModel; 

import com.github.amitkma.boilerplate.domain.interactor.GetUserList; 
import com.github.amitkma.boilerplate.domain.model.User; 
import com.github.amitkma.boilerplate.presentation.data.Resource; 
import com.github.amitkma.boilerplate.presentation.data.ResourceState; 
import com.github.amitkma.boilerplate.presentation.mapper.UserMapper; 
import com.github.amitkma.boilerplate.presentation.vo.UserView; 

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

import javax.inject.Inject; 

import io.reactivex.subscribers.DisposableSubscriber; 

public class UserViewModel extends ViewModel { 

    private final GetUserList mGetUserList; 
    private final UserMapper mUserMapper; 

    @Inject 
    public UserViewModel(GetUserList getUserList, 
      UserMapper userMapper) { 
     mGetUserList = getUserList; 
     mUserMapper = userMapper; 
     fetchUsers(); 
    } 

    public void fetchUsers(){ 
     mUserMutableLiveData.postValue(new Resource(ResourceState.LOADING, null, null)); 
     mGetUserList.execute(new UserSubscriber(), null); 
    } 

    public LiveData<Resource<List<UserView>>> getUsers(){ 
     return mUserMutableLiveData; 
    } 

    @Override 
    protected void onCleared() { 
     mGetUserList.dispose(); 
     super.onCleared(); 
    } 

    private final MutableLiveData<Resource<List<UserView>>> mUserMutableLiveData = 
     new MutableLiveData<>(); 

}

+1

もっとコードを投稿する必要があります。アクティビティの 'import'sとクラス定義を表示します。 –

+0

私はコードを追加しました。見てください。 –

+0

私はあなたのViewModelにDisposableSubscriberをインポートすることを除いて、何の問題もありません。 –

答えて

4

です。

LifecycleOwnerを拡張するAppCompatActivityによってアクティビティを拡張するだけです。

このインターフェイスはAPIレベル1.0.0で廃止されました。 LifecycleOwnerを拡張する android.support.v7.app.AppCompatActivityを使用してください。 このクラスの使用例はありません。

あなたが断片について同じ26.1

少なくともサポート-libが必要

private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this); 

@Override 
public LifecycleRegistry getLifecycle() { 
    return lifecycleRegistry; 
} 

を上書きするのを忘れました。あなたの断片を延長してくださいLifecycleFragmentandroid.support.v4.app.Fragment

編集:ちょうどKotlinを使って簡単なサンプルプロジェクトを再構築するだけです。

class MainActivity : AppCompatActivity(), HasSupportFragmentInjector, AnkoLogger { 
    private val lifecycleRegistry by lazy { android.arch.lifecycle.LifecycleRegistry(this) } 
    private val viewModel by lazy { ViewModelProviders.of(this, viewModelFactory).get(BridgesVm::class.java) } 
    override fun getLifecycle() = lifecycleRegistry 

    public override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     viewModel.data.observe(this, Observer<Bridge?> { info { "Received" } }) 
    } 
} 

class BridgesVm @Inject constructor() : ViewModel() { 
     val data: LiveData<Bridge> = MutableLiveData<Bridge>() 
} 

編集:

アーチバージョンのベータ1を使用して問題があります。これが修正されるまで、1.0.0-alpha9-1の使用を検討してください。私の場合は、ベータ1を使用していてもアルファを使っていればうまくいきませんでした9-1

+0

アクティビティとビューモデルクラスコードを追加しました。親切にそれを見てください。 –

+0

が更新されました。 getLifecycle()をオーバーライドするようにしてください。 –

+1

私はすでにそれを試みました。 LifecycleRegistry mLifecycleRegistry =新しいライフサイクルレジストリ(this); 問題は同じです。 LifecycleRegistry(LifecycleOwner)をpackageName.BrowseActivityに適用できないと言っています –

関連する問題