Обновить внутренний / вложенный RecyclerView из приемника BroadCast - PullRequest
0 голосов
/ 16 июня 2020

У меня есть CardViewAdapter, который отображает список папок по вертикали, а затем внутренний horizontalAdapter отображает содержимое папки по горизонтали следующим образом:

class CardViewAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    private var collectionItems : CollectionItems? = null

    fun setData(collectionItems : CollectionItems) {
        this.collectionItems = collectionItems
        this.notifyDataSetChanged()
    }


    fun updateRow(resourceID : String){
        this.collectionItems?.resourceList?.forEach { map ->
            map.value.forEach { resourceWState ->
                if (resourceWState.component?.uuid == resourceID) {
                    val index = (this.collectionItems?.resourceList!!.keys).indexOf(map.key)
                    this.notifyItemChanged(index) // This works but it updates the whole row, not item
                }
            }
        }
    }

    private inner class ViewHolderCard internal constructor(itemView: View, var resource : ResourceWithState? = null, var tabKeyHolder : Int? = null) : RecyclerView.ViewHolder(itemView) {

        internal var fragmentCallback: FragmentCallback? = null
        internal var horizontalAdapter: ResourcesByCategoryAdapter? = ResourcesByCategoryAdapter()
        internal var mLastClickTime : Long = 0

        init {
            itemView.inner_recyclerview.layoutManager = LinearLayoutManager(itemView.context, LinearLayoutManager.HORIZONTAL, false)
            itemView.inner_recyclerview.isNestedScrollingEnabled = false
            itemView.inner_recyclerview.layoutManager!!.isItemPrefetchEnabled = true
            itemView.inner_recyclerview.setHasFixedSize(true)
            itemView.inner_recyclerview.setItemViewCacheSize(20)
            horizontalAdapter?.hasStableIds()
            horizontalAdapter?.courseID = courseID
            itemView.inner_recyclerview.adapter = horizontalAdapter
            fragmentCallback = itemView.context as FragmentCallback

        }

        internal fun bind(position: Int) {
            val dataList = ArrayList(collectionItems!!.resourceList.values)[position]

            tabKeyHolder = tabKey
            resource = ArrayList(collectionItems!!.resourceList.keys)[position]
            val convertToArray : ArrayList<ResourceWithState> = ArrayList()
            dataList.toCollection(convertToArray)
            horizontalAdapter!!.setData(convertToArray)
            horizontalAdapter!!.setCategory(itemView.book_category.text.toString())

            // How to call this?
            fun updateItem(resourceUUID: String){
                horizontalAdapter!!.update(resourceUUID)
            }

        }

    }

И это упрощенный класс CollectionItems: enter image description here

Я хотел бы обновить imageView в одном из элементов внутри папки при загрузке элемента. У меня уже есть широковещательный приемник во фрагменте, который вызывает метод updateRow. Это работает, но я хотел бы иметь возможность обновлять элемент, а не строку. Как мне получить доступ к методу updateItem в ViewHolder?

// How to call this?
   fun updateItem(resourceUUID: String){
       horizontalAdapter!!.update(resourceUUID)
   }
...