2017-11-01 12 views
1

初めてルームとデータのバインディングを実装する。私ViewModelデータバインディングライブラリを使用してルームデータベースからLiveDataの変更を観察する方法

var numberOfClubs = ObservableInt(0) 
private var clubs: LiveData<List<Club>> = clubDao.getAllClubs() 

私は、ルームデータベースに挿入するが、KotlinNullPointerExceptionたびに取得しています後clubs.valueを取得しよう。

fun addClubs() { 
    Observable.fromCallable({ 
     clubDao.insertClubs(listOf(Club(null, "clubName")) 
    }) 
     .subscribeOn(schedulerFacade.computation) 
     .subscribe(
      { 
       numberOfClubs.set(clubs.value!!.size) <--- Kotlin NPE 
      }, 
      { error -> 
       logWrapper.e("MainViewModel", error.message!!) 
       clubError.set(true) 
      }) 
} 

私のXMLで私は電話しています:android:text="@{viewModel.numberOfClubs}"

ルームデータベースに挿入しても何も返されないため、結果としてnumberOfClubsを設定することはできません。私はclubsが変更を追跡すべきだと思った?

答えて

0

私はLiveDataという誤解がありました。 LiveDataオブジェクトを取得するためには、放出するものは.observe()です。 LiveDataはライフサイクルに対応しているためFragmentまたはActivityからはLifecycleOwnerへの参照があり、.observe()に渡される最初のパラメータである必要があるため、.observe()が最もよく呼び出されます。

私は私のActivityからViewModelObservableIntを設定するが、私は使用されるように、私はおそらくベストプラクティスに従うていないよ。

viewModel.clubs 
    .observe(this, Observer { clubs -> 
     viewModel.numberOfClubs.set(clubs!!.size) 
    }) 
1

あなたが考え出してはい、すでにLiveDataは、ライフサイクルを認識しています。それは、ライブバイクオーナーが存在するのと同じくらい長く観察することを意味します。

すでにソリューションを投稿している場合でも、使用しないでください!まったく。

viewModel.clubs.observe(this, { 
    it?.let { 
     viewModel.numberOfClubs.set(it.size) 
    } 
) 

は、受信したリストのサイズを割り当てる前にヌルチェックを行う適切な方法です。あなたは、レイアウト内の項目のサイズを取得したい場合

ところで

、あなたは

text="@{viewModel.clubsList.size() + ``}" 

を使用して、リストではなく、

val clubsList = ObservableArrayList<..>() 

viewModel.clubs.observe(this, { 
    it?.let { 
     viewModel.clubsList.set(it) 
    } 
) 
+0

は多くのために感謝使用してリストのサイズを観察する必要がありますコメントを追加しました:) –

関連する問題