을 만드는 방법 LiveData<MutableList<T>>업데이트를 변경하는 경우 속 T?

0

질문

내가 만드는 응용 프로그램을 얻(의사)지연 시간 값을 요청하여 어떤 url 을 기록 얼마나 오래 걸릴 것입니다.

첫째,내가 사용하는 개조를 얻을 JSON 으로 응답에서 웹 서버에 있습니다. 이 응답이 포함되어:호스트의 이름을(예를 들어 Ebay UK),의 url 에서 호스트(예: www.ebay.co.uk고),이미지 url. 난지도 응답이에 데이터의 클래스는 다음과 같습니다:

data class(
    val name: String,
    var url: String,
    val icon: String,
    var averagePing: Long = -1
)

url var 재산으로 하기 전에 호출하여 얻을 지연 값을 추가 할 필요가있 https://하기 위해서 요청을 합니다.

하고 있어요 모두 이렇게:

fun getHostsLiveData() {
    viewModelScope.launch(Dispatchers.IO) {
        val hostList = repo.getHosts()
        for (host in hostList) {
            host.url = "https://" + host.url
            host.averagePing = -1
        }
        hostListLiveData.postValue(hostList)//updated the recyclerview with initial values
        //with default (-1) value of averagePing

        for (host in hostList) {
            async { pingHostAndUpdate(host.url, hostList) }
        }
    }
}

에 대한 첫 번째는 루프를 준비합니다. 후에 라인에 대한 반복 제출하는 데이터를 재활용 어댑터를 보여주기 위해,호스트 이름,url 과 아이콘이다(이 모든 작업,즉 내가 작업을 관찰자에 대한 LiveData),는 동안 난 기다리고 있는 지연 값입니다.

두 번째는 루프를 위한 함수를 호출을 계산하는 지연 값을 각 호스트와 updateHostList()함수 업데이트 LiveData.

이 얼마나 기능보:

suspend fun pingHostAndUpdate(url: String, hostList: MutableList<Host>) {
    try {
        val before = Calendar.getInstance().timeInMillis
        val connection = URL(url).openConnection() as HttpURLConnection //Need error handling
        connection.connectTimeout = 5*1000
        connection.connect()
        val after = Calendar.getInstance().timeInMillis
        connection.disconnect()
        val diff = after - before
        updateHostList(url, diff, hostList)
    } catch (e: MalformedURLException) {
        Log.e("MalformedURLExceptionTAG", "MalformedURLException")
    } catch (e: IOException) {
        Log.e("IOExceptionTAG", "IOException")
    }
}

fun updateHostList(url: String, pingResult: Long, hostList: MutableList<Host>) {
    //All this on mainThread
    var foundHost: Host? = null
    var index = 0
    for (host in hostListLiveData.value!!) { 
        if (host.url == url) {
            foundHost = host
            break
        }
        index++
    } 
    if (foundHost != null) {
        viewModelScope.launch(Dispatchers.Main) {
            val host =  Host(foundHost.name, foundHost.url, foundHost.icon, pingResult)
            Log.d("TAAAG", "$host") 
            hostList[index] = host
            hostListLiveData.value = hostList
        }
    }
}

이 모든 일에서 뷰 모델. 현재 업데이트하고 제 목록을 제출하여 전체 목록을 다시 변경했을 경우,하나의 재산이 하나의 요소의 목록 보이는 끔찍한다.

나의 질문은 어떻게 업데이트할 수 있습니 하나만산의 호스트와 새로 UI 를 자동으로?

사전에 감사합니다

편집:내 관찰자는 다음과 같습니다:

viewModel.hostListLiveData.observe(this, Observer { adapter.updateData(it) })

고 updateData()는 다음과 같습니다:

fun updateData(freshHostList: List<Host>) {
    hostList.clear()
    hostList.addAll(freshHostList)
    notifyDataSetChanged()
}

@ArpitShukla,당신은 제가 2 업데이트 기능은 무엇입니까? 하나 보여주기를 위한 초기의 목록 및 다른 업데이트 항목의 목록입니다. 하는 것 또는 나 그냥 넣어 두 notifyDataSetChanged()및 notifyItemChanged()에 updateData()?

Edit2:된 함수 호출에 그것을 만들 async.

android-livedata kotlin
2021-11-23 22:53:04
1

최고의 응답

1

고려할 수 있습니다 업데이트 항목에서 관찰 hostListLiveDatanotifyItemChanged(position)notifyDataSetChanged()adapter.

notifyItemChanged(position) 항목 이벤트 변경,업데이트 내용만의 항목입니다.

편집:
당신이 사용하는 notifyDataSetChanged() 에 업데이트의 콘텐츠에 데이터를 야기하는 레이아웃 작업하고 다시 바인딩 RecyclerView 는 당신이하지 않습니다. 따라서 당해 업데이트의 콘텐츠에 데이터을 사용하여 notifyItemChanged(position).

나는 생각을 만들 수 있습니다 새로운 기능에 대한 업데이트 RecyclerView 에서 예를 들어 어댑터

fun updateHostAndPing(updatedHost: Host, position: Int) {
    hostList[position].apply {
        url = updatedHost.url
        averagePing = updatedHost.averagePing
    }
    notifyItemChanged(position)
}

고서 관찰자가 필요할 수 있습 여부를 확인하려면 신선한 목록 또는 목록을 업데이트

viewModel.hostListLiveData.observe(this, Observer { 
    if (adapter.itemCount == ZERO) {
        adapter.updateData(it) 
    } else {
        it.forEachIndexed { index, host ->
            adapter.updateHostAndPing(host, index) 
        }
    }
})
2021-11-24 23:12:08

이 작품은,그러나 나는 생각하지 않는 이와 관련된 LiveData. 오늘은 한 단순 재활용 볼 수 있는 목록을 보여줍니다 이를 테스트하고 노래합니다.notifyItemChanged(위치). 이 일했지만 나는 보지 않는 방법과 관련된 LiveData. 수를 명확하게 설명하십시오? P.S.:는 질문에는 방법을 보여주는 내 작품을 관찰자,내 생각을 줄 것이다 당신은 좀 더 많은 컨텍스트
SpawnTheTronix

네,그것에 대한 아 LiveData,그것은 방식으로 인해 업데이트 RecyclerView. 당신이 사용하는 notifyDataSetChanged() 에 업데이트의 콘텐츠에 데이터를(예를 들어를 업데이트 hostping). 이 notifyDataSetChanged() 완전히 다시 바인딩 및 레이아웃 작업 표시되는 모든 데이터입니다.
Putra Nugraha

나 또한 시도를 사용하여 ListAdapterRecyclerView.Adapter을 달성하였 내가 원하는 기능 뿐입니다. 당신은 더 나은 것을 사용하여, notifyDataSetChanged()ListAdapter? 지금까지 내가 이해 notifyDataSetChanged()업데이트 보기(행서 RecyclerView도)은 당신이 그것을 말해 업데이트합니다.ListAdapter 검사의 차이에 대한 새로운 목록에 오래 된 목록,그리고 그 후 업데이트를 변경된 분야(i.e TextView는)새로운 가치(지만 나는 확실하지 않다면 그것이 업데이트만 TextView 또는 전체를 행하는 경우에 없을 것이 차이가?).
SpawnTheTronix

ListAdapter 후드 사용 AsyncListDiffer 을 계산하는 데 도움이 되 사이의 차이점은 저장된 데이터와 데이터를 제공,그리고 어떻게 비교 데이터를 기반으로 정의된 상태에서 DiffUtil.ItemCallback. AFAIK, ListAdapter 지 않을 것이다 당신의 레이아웃 작업 RecyclerView지만,업데이트된 데이터입니다. 론, ListAdapter 또한 가능한 솔루션을 위해 당신의 경우 어쨌든
Putra Nugraha

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................