2017-11-01 6 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은 수명주기를 인식하기 때문에은 첫 번째 매개 변수가 .observe()으로 전달되어야하며 에 대한 참조가 있으므로 Fragment 또는 Activity에서 가장 잘 호출됩니다. 내 Activity에서 ViewModelObservableInt을 설정하지만 사용

나는 아마 모범 사례를 다음과 아니에요 : 당신이 알아 낸대로 예, 이미 LiveData 인식 라이프 사이클이

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

입니다. 그것은 살아있는 자전거 주인이 존재할 때까지 관찰한다는 것을 의미합니다.

이미 솔루션을 게시 한 경우에도 사용하면 안됩니다! 조금도.

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

가 많은에 대한 감사를 사용하여 목록 크기를 준수해야 덧글 추가 :) –

관련 문제