Android TV Leanback 簡介

TV 縱向滑動列表介紹

構(gòu)建滑動列表的幾種方式:

  • ListView / RecyclerView
  • 自定義LinearLayout/ScrollView/ViewGroup
  • 采用leanback庫

google leanback 庫簡介

“Leanback” 就是靠著看的意思。是指以放松的姿勢倒在沙發(fā)上.谷歌推出 android.support.v17.leanback 軟件包提供的 API 支持在電視設(shè)備上構(gòu)建用戶界面。它為電視應(yīng)用提供了一些重要的小部件。這個庫只支持到api 17以上的版本,也就是andorid 4.2,而一些效果也只是在api-21以上支持。

demo介紹:

  • 首先用android Tv的例子來介紹。運行程序時,整體內(nèi)容被對齊在一個網(wǎng)格布局里。左側(cè)的每一個標題header,都有右側(cè)對應(yīng)的一個內(nèi)容行row,他們是一一對應(yīng)的。header+content row由一個類 ListRow來表示。頁面的整體其實是ListRow的集合
RowsAdapter1-1024x577.png
  • 整體是一個大的ArrayObjectAdapter 由一系列的ListRow來填充。view的呈現(xiàn)方式由ListRowPresenter來定義。
  • 一個ListRow 由HeaderItem 和一個小的ArrayObjectAdapter組成,這個一行中的ArrayObjectAdapter中放置我們定義的view,呈現(xiàn)方式由CardPresenter來定義。
    典型的代碼如下:
List<Movie> list = MovieList.setupMovies();

       mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
       CardPresenter cardPresenter = new CardPresenter();

       
       for (int i = 0; i < NUM_ROWS; i++) {
           if (i != 0) {
               Collections.shuffle(list);
           }
           ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
           for (int j = 0; j < NUM_COLS; j++) {
               listRowAdapter.add(list.get(j % 5));
           }
           HeaderItem header = new HeaderItem(i, MovieList.MOVIE_CATEGORY[i]);
           mRowsAdapter.add(new ListRow(header, listRowAdapter));
       }
        setAdapter(mRowsAdapter);
  • 基本關(guān)系:
    ArrayObjectAdapter (RowsAdapter) ← A set of ListRow
    ListRow = HeaderItem + ArrayObjectAdapter (RowAdapter)
    ArrayObjectAdapter (RowAdapter) ← A set of Object (CardInfo/Item)
ListRow1.png

MVP的構(gòu)建模式

Leanback 提供了model-view-presenter mvp的方式來構(gòu)建應(yīng)用。

  • model 是由應(yīng)用開發(fā)者來提供,leanback對于model的實現(xiàn)沒有加額外的限制,任何對象都是可以的。

  • view 還是由原來的android.view包下的類來實現(xiàn)。

  • Presenter 是基于現(xiàn)在的Adapter的該概念,并擴充為更具的靈活性和組合性。特別的是,綁定數(shù)據(jù)到view上的操作已經(jīng)將adapter中分離出去,這部分邏輯由presenter去承擔。

Presenter

Presenter class 是用來做數(shù)據(jù)和視圖的橋梁的
每一行的視圖展示,每一個卡片的視圖展示都是由Presenter來定義。Presenter是一個抽象類,需要自己來繼承該類。

需要實現(xiàn)下面的三個方法:

  1. onCreateViewHolder(ViewGroup parent);
  2. OnBindViewHolder(ViewHolder ViewHolder,Ojbect item);
  3. onUnBindViewHolder(Viewholder viewhlder);可以看到這些方法跟RecyclerView 的Apdater的實現(xiàn)方法很像,實際上這些方法就是借鑒了recyclerview的實現(xiàn)。
    不同的是多了一個onUnBindViewHolder的方法,在這個方法里,可以做一下釋放資源的操作,主要包括圖片資源。

View

  1. 數(shù)據(jù)model的容器 ObjectAdapter,類似于RecyclerView.Adapter,但是將迭代展示每個item對應(yīng)的view的任務(wù)分離了出去。實現(xiàn)類有ArrayObjectAdapter和CursorOjbectAdapter,前者持有列表數(shù)據(jù)。我們可以是實現(xiàn)自己的ObjectAdapter的子類。

  2. Preseter 負責將數(shù)據(jù)綁定到view上,并呈現(xiàn)view;presener和ObjectAdapter合起來相當于現(xiàn)在的Android里的Adapter.這種分離的優(yōu)勢在于,我們可以在Adaper的范圍之外去控制view的創(chuàng)建。例如一個view是從單個對象的數(shù)據(jù)中產(chǎn)生的,另外的view是有ObjectAdapter來提供數(shù)據(jù)。比如我們現(xiàn)在頁面的構(gòu)成是由一個header 加一個vip行,再加多個相同模式的行。

  3. PresenterSelector類,用來選擇用哪一個Presenter去對于ObjectAdapter提供的數(shù)據(jù)適配。通常是根據(jù)不同的item類型選擇Presenter去適配.現(xiàn)在的頁面中有多行相同視圖展示的,也有其他少數(shù)幾行展示的模式,這中情況下,例如聚好看的有頭部的一行,和進入vip的一行,還有其他的列表行,這種情況下就可以用。

  4. leanback 提供的基本界面是縱向的列表,每個行元素是一個橫向的列表,縱向列表和橫向列表都用ObjectAdapter來提供數(shù)據(jù)。

  5. Row 是leanback中定義的一個抽象類,包含一個header和一個ListRow ,ListRow是Row的實現(xiàn)類,代表一個橫行.用ListRowPresenter來展示view.我們也可以定義自己的RowPresenter來定義行的展示。

整體的介紹:

  1. 整體是一個縱向的recyclerview VerticalCardVeiw 是一個經(jīng)過改寫的recyclerview,增加了不少的適用于大屏幕的方法。

  2. ItemBridgeAdapter 繼承自RecyclerView.Adapter,作為從RecyclerView.Adpater到Presenter的橋梁。
    內(nèi)部持有PresenterSelector 的一個引用。
    在getItemViewType 方法的實現(xiàn)中,會返回相應(yīng)的Presenter,以此實現(xiàn)不同的item布局選擇。

  3. 在onCreateViewHolder的方法實現(xiàn)中,會調(diào)用在上面的方法里選擇出的Presenter 的presenter.onCreateViewHolder方法,返回一個Presenter.ViewHolder 該類是FacetProvider的實現(xiàn)類。 ItemBridgeAdapter 本身有一個Viewholder,持有上面生成的 presenter和一個itemVeiw.

  4. 在OnBindViewHolder中,用上面拿到的presenter的引用來調(diào)用mPresenter.onBindViewHolder(viewHolder.mHolder, viewHolder.mItem),如這次是CardPrenter的 onBindViewHolder在這個方法里執(zhí)行對數(shù)據(jù)與視圖的綁定。

  5. 在itemview不可見時,onViewRecycled方法會被調(diào)用,在這個里面會調(diào)用presenter.onUnbindViewHolder,從名字可以看出來這個是在解除view的綁定時執(zhí)行,通常在這個方法里執(zhí)行釋放資源的操作,例如釋放圖片的引用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,214評論 25 708
  • Tangram是阿里出品、用于快速實現(xiàn)組合布局的框架模型,在手機天貓Android&iOS版 內(nèi)廣泛使用 該框架提...
    wintersweett閱讀 3,575評論 0 1
  • 簡介: 提供一個讓有限的窗口變成一個大數(shù)據(jù)集的靈活視圖。 術(shù)語表: Adapter:RecyclerView的子類...
    酷泡泡閱讀 5,385評論 0 16
  • 一、概述 對于RecyclerView的學(xué)習(xí),主要是需要掌握以下幾點: 數(shù)據(jù):Adapter 使用:Recycle...
    澤毛閱讀 7,646評論 1 23
  • 6appium環(huán)境搭建-2android-sdk
    于春海閱讀 198評論 0 0

友情鏈接更多精彩內(nèi)容