Android - Невозможно обновить RecyclerView после того, как я получу все ссылки для скачивания из Firebase Storage - PullRequest
0 голосов
/ 30 марта 2020

Я хочу получить все видеофайлы из хранилища Firebase и отобразить их в RecyclerView. Мне удалось получить все файлы, но я не могу обновить RecyclerView, как только я получу все полученные файлы. Вот код

 recyclerViewVideoList.setHasFixedSize(true)
 recyclerViewVideoList.layoutManager = LinearLayoutManager(this)
 recyclerViewVideoList.adapter = VideoListRecyclerViewAdapter(applicationContext,videoList, this)
 getVideos()

 private fun getVideos() {
    val listRef = firebaseStorage.reference.child("videos")
    listRef.listAll()
        .addOnSuccessListener { listResult ->
            listResult.items.forEach { item ->
                item.downloadUrl.addOnSuccessListener {
                    videoList.add(Video(item.name, it.toString(), "565656"))
                }
            }
           recyclerViewVideoList.adapter!!.notifyDataSetChanged()
        }
        .addOnFailureListener {
            Toast.makeText(applicationContext, "Something went wrong. Please try again", Toast.LENGTH_SHORT).show()
        }
}

Существует решение здесь , но оно вызывает notifyDataSetChanged () несколько раз. Я хочу избежать этого.

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Более эффективное решение - вызвать функцию notifyDataSetChanged () только для последнего элемента элемента списка. Делая это, ваша функция notifyDataSetChanged () выполняется только для последнего элемента и обновляется все представление переработчика.

Измените это:

   .addOnSuccessListener { listResult ->
        listResult.items.forEach { item ->
            item.downloadUrl.addOnSuccessListener {
                videoList.add(Video(item.name, it.toString(), "565656"))
            }
        }
       recyclerViewVideoList.adapter!!.notifyDataSetChanged()
    }

this

//Declare one integer count variable var count = 0

     .addOnSuccessListener { listResult ->
        listResult.items.forEach { item ->
            item.downloadUrl.addOnSuccessListener {
                videoList.add(Video(item.name, it.toString(), "565656"))
                count++
                if(count == listResult.items.size)
                   recyclerViewVideoList.adapter!!.notifyDataSetChanged()  
            }
        }
    }
0 голосов
/ 30 марта 2020

Измените это:

         .addOnSuccessListener { listResult ->
            listResult.items.forEach { item ->
                item.downloadUrl.addOnSuccessListener {
                    videoList.add(Video(item.name, it.toString(), "565656"))
                }
            }
           recyclerViewVideoList.adapter!!.notifyDataSetChanged()
        }

на это:

        .addOnSuccessListener { listResult ->
            listResult.items.forEach { item ->
                item.downloadUrl.addOnSuccessListener {
                    videoList.add(Video(item.name, it.toString(), "565656"))
                    recyclerViewVideoList.adapter!!.notifyDataSetChanged()
                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...