iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
0

昨天的練習做完之後是 一個 Category 對上 一行 Row
今天我們要來練習 一個 Category 對上 一個 RowsSupportFragment
所以這樣就是左邊每選到一個 Category 右邊就會換掉整頁的 RowsSupportFragment 喔

有的昨天的基礎之後
今天應該可以融會貫通知道我們會多一層 ArrayObjectAdapter 來做今天的實作

下載一下今天的 Json 吧,也是多了一層喔

不好意思大家
讓大家久等了
目前這個主題有點卡關
卡關的點在於目前 androidx 的 leanback library 中的 BrowseSupportFragment 無法達成這個結果
但是若使用已被棄用的 BrowseFragment 的話是可以完成的
這邊也給大家一個可以 Work 的範例來研究一下
連結在此

等研究出來會再回來補充這篇喔
不好意思大家~~


我回來了大家
不知道大家有沒有離去
我已經解掉這個問題囉
先跟大家說一下我之前錯誤的構思
以下是我原本以為可以執行的程式碼

fun init(){
    val mainAdapter: ArrayObjectAdapter = ArrayObjectAdapter()
    if(mMovieList!=null){
        mMovieListData = mMovieList!!.data
        if(mMovieListData!=null && mMovieListData!!.isNotEmpty()){
            for((categoryIndex, category) in mMovieListData!!.withIndex()){
                val rowsAdapter: ArrayObjectAdapter = ArrayObjectAdapter(ListRowPresenter())
                val categoryName: String? = category.category_name
                if(BuildConfig.DEBUG) Log.w(TAG, "categoryName: $categoryName")
                val subCategoryList: List<SubCategory>? = category.sub_categories
                if(subCategoryList!=null && subCategoryList.isNotEmpty()){
                    for ((subCategoryIndex, subCategory) in subCategoryList.withIndex()){
                        val subCategoryName: String? = subCategory.sub_category_name
                        if(BuildConfig.DEBUG) Log.d(TAG, "subCategoryName: $subCategoryName")
                        val items: List<Item>? = subCategory.items
                        val listRowAdapter: ArrayObjectAdapter = ArrayObjectAdapter(CustomCardPresenter())
                        if(items!=null && items.isNotEmpty()){
                            for(item in items){
                                if(BuildConfig.DEBUG) Log.i(TAG, "movieName: ${item.name}")
                                listRowAdapter.add(item)
                            }
                            val header: HeaderItem = HeaderItem(0, subCategoryName)
                            rowsAdapter.add(ListRow(header, listRowAdapter))
                        }
                    }
                }
                // 新增 fragmentAdapter
                val fragmentAdapter: ArrayObjectAdapter = ArrayObjectAdapter()
                val rowsSupportFragment: RowsSupportFragment = RowsSupportFragment()
                rowsSupportFragment.adapter = rowsAdapter
                fragmentAdapter.add(rowsSupportFragment)
                val header: HeaderItem = HeaderItem(0, categoryName)
                mainAdapter.add(ListRow(header, fragmentAdapter))
            }
        }
    }
    adapter = mainAdapter
    if(activity!=null){
        //左側 HeaderSupportFragment 的背景
        brandColor = ContextCompat.getColor(activity!!, R.color.header_background)
        //右側右上方 icon
        badgeDrawable = ContextCompat.getDrawable(activity!!, R.drawable.vscinemas_logo)
    }
}

新增 fragmentAdapter 這段是我以前 2017 年的專案可以 Work 的程式碼
但我忽略了一個事情就是,之前的專案為了做許多客製化的東西,把 BrowsFragment、RowsFragment 等等原始程式碼通通都拉出來到專案裡頭了,以至於官方在後面有更新了什麼東西舊的專案都不會跟著更新,所以造成舊的可以新的不行這種狀況

言歸正傳
那新的 leanback library 要如何做到這種效果呢
我在 Day 21 - PageRow 會詳細介紹喔~


上一篇
Day 13 - ArrayObjectAdapter & Presenter
下一篇
Day 15 - CustomCardPresenter
系列文
宅經濟起飛,想當顆沙發馬鈴薯嗎??智慧電視會是未來的趨勢嗎??讓我們一探 Android TV 的神秘世界30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言