2017-12-22 22 views
0

LiveData 목록에 항목이 추가되면 Observer 이벤트를 가져와야합니다. 그러나 내가 이전 목록을 새로운 것으로 바꿀 때만 이벤트가받는 것으로 이해합니다. 예를 들어 다음을 수행 할 때 :Observer에게 LiveData 목록 추가 시점 알림

list.value = mutableListOf(IssuePost(UserEntity(name, email, photoUrl), issueEntity)) 

Observer 이벤트가 발생합니다. 그러나 가치에 항목을 추가 할 때 옵저버는 침묵합니다. 내가 원하는 것을 어떻게 구현할 수 있는지 조언 해 주시겠습니까?

+0

당신이 말한 것처럼 그 wotking. 당신은 LiveData의 서브 클래스를 생성 할 수 있고 이전리스트로부터 새로운리스트를 생성하고 새로운 원소를 추가 할 메소드 "add"를 만들 수 있습니다. – bongo

+0

@bongo 무엇을 의미합니까? 목록에 항목을 추가하면 작동합니까? – LeShChEnKoUa

+0

"예전의 목록을 새로운 것으로 바꿀 때만 이벤트가 받는다는 것을 이해하는 한"fa으로. – bongo

답변

1

내부적으로 LiveData는 각 변경 사항을 버전 번호 (int로 저장된 간단한 카운터)로 추적합니다. setValue()를 호출하면이 버전이 증가하고 모든 관찰자가 새 데이터로 업데이트됩니다 (관찰자의 버전 번호가 LiveData의 버전보다 작은 경우에만).

이 프로세스를 시작하는 유일한 방법은 setValue() 또는 postValue()를 호출하는 것입니다. 부작용은 LiveData의 기본 데이터 구조가 변경된 경우 (예 : 컬렉션에 요소를 추가하는 경우) 관찰자에게 알림을 보내지 않습니다.

따라서 목록에 항목을 추가 한 후에는 setValue()를 호출해야합니다. 나는 당신이 이것에 접근 할 수있는 두 가지 방법을 제공했다. 나는 첫 번째 옵션을 더 좋아한다. 1

옵션은 참조하여 LiveData의 외부 및 업데이트 목록의 내용이 변경 언제든지 목록을 유지합니다.

private val mIssuePosts = ArrayList<IssuePost>() 
private val mIssuePostLiveData = MutableLiveData<List<IssuePost>>() 

fun addIssuePost(issuePost: IssuePost) { 
    mIssuePosts.add(issuePost) 
    mIssuePostLiveData.value = mIssuePosts 
} 

옵션 2

LiveData를 통해 목록의 트랙을 유지하고 목록의 내용이 변경 될 때마다 자신의 값으로 LiveData를 업데이트합니다.

private val mIssuePostLiveData = MutableLiveData<List<IssuePost>>() 

init { 
    mIssuePostLiveData.value = ArrayList() 
} 

fun addIssuePost(issuePost: IssuePost) { 
    mIssuePostLiveData.value?.add(issuePost) 
    mIssuePostLiveData.value = mIssuePostLiveData.value 
} 

이러한 솔루션 중 하나를 사용하면 현재 목록을 수정하여 관찰자에게 알릴 때마다 새 목록을 만들어야합니다.