Android TV開發(fā)之卡片視圖

在上一篇文章中痒芝,我們利用BrowseSupportFragment創(chuàng)建了一個目錄瀏覽器侠驯,其中顯示了一個媒體項列表兄纺。在本課中着降,您將為媒體項創(chuàng)建卡片視圖(ImageCardView),并在BrowseSupportFragment中呈現(xiàn)它們泳炉。
BaseCardView 類及其子類顯示與媒體項關聯(lián)的元數(shù)據(jù)私蕾。本文中使用的 ImageCardView 類可顯示內(nèi)容的圖像以及媒體項的標題。
本課中所介紹的代碼來自 Android TV GitHub 代碼庫中的 Android Leanback 示例應用胡桃。您可借助此示例代碼開始編寫自己的應用踩叭。

圖 1. 選中后的 Leanback 示例應用圖像卡片視圖。

創(chuàng)建卡片 Presenter

Presenter 生成視圖并根據(jù)需要為視圖綁定對象翠胰。在應用向用戶呈現(xiàn)內(nèi)容的瀏覽 Fragment 中容贝,您可以為內(nèi)容卡片創(chuàng)建一個 Presenter,并將其傳遞給將內(nèi)容添加到屏幕的 Adapter之景。在以下代碼中斤富,在 LoaderManageronLoadFinished() 回調(diào)中創(chuàng)建了 CardPresenter

    @Override
    public void onLoadFinished(Loader<HashMap<String, List<Movie>>> arg0,
                               HashMap<String, List<Movie>> data) {

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

        int i = 0;

        for (Map.Entry<String, List<Movie>> entry : data.entrySet()) {
            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
            List<Movie> list = entry.getValue();

            for (int j = 0; j < list.size(); j++) {
                listRowAdapter.add(list.get(j));
            }
            HeaderItem header = new HeaderItem(i, entry.getKey());
            i++;
            rowsAdapter.add(new ListRow(header, listRowAdapter));
        }

        HeaderItem gridHeader = new HeaderItem(i, getString(R.string.more_samples));

        GridItemPresenter gridPresenter = new GridItemPresenter();
        ArrayObjectAdapter gridRowAdapter = new ArrayObjectAdapter(gridPresenter);
        gridRowAdapter.add(getString(R.string.grid_view));
        gridRowAdapter.add(getString(R.string.error_fragment));
        gridRowAdapter.add(getString(R.string.personal_settings));
        rowsAdapter.add(new ListRow(gridHeader, gridRowAdapter));

        setAdapter(rowsAdapter);

        updateRecommendations();
    }

創(chuàng)建卡片視圖

在此步驟中锻狗,您將為描述媒體內(nèi)容項的卡片視圖構建卡片 Presenter 及視圖 Holder满力。請注意,每個 Presenter 僅可創(chuàng)建一種類型的視圖轻纪。如果您有兩種不同類型的卡片視圖油额,您將需要兩個不同的卡片 Presenter。
Presenter 回調(diào)來創(chuàng)建可用于顯示內(nèi)容項的視圖 Holder刻帚。

    @Override
    public class CardPresenter extends Presenter {

        private Context context;
        private static int CARD_WIDTH = 313;
        private static int CARD_HEIGHT = 176;
        private Drawable defaultCardImage;

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent) {
            context = parent.getContext();
            defaultCardImage = context.getResources().getDrawable(R.drawable.movie);
    ...

onCreateViewHolder() 方法中潦嘶,為內(nèi)容項創(chuàng)建一個卡片視圖。以下示例使用了 ImageCardView崇众。
當選中一張卡片時掂僵,默認行為會將它展開為更大的尺寸。如果您想為選定的卡片指定不同的顏色顷歌,請按照如下代碼所示調(diào)用 setSelected()锰蓬。

    ...
        ImageCardView cardView = new ImageCardView(context) {
            @Override
            public void setSelected(boolean selected) {
                int selected_background = context.getResources().getColor(R.color.detail_background);
                int default_background = context.getResources().getColor(R.color.default_background);
                int color = selected ? selected_background : default_background;
                findViewById(R.id.info_field).setBackgroundColor(color);
                super.setSelected(selected);
            }
        };
    ...

當用戶打開您的應用時,Presenter.ViewHolder 會顯示內(nèi)容項的 CardView 對象眯漩。您需要通過調(diào)用 setFocusable(true)setFocusableInTouchMode(true) 來設置這些對象芹扭,使其從方向鍵控制器接收焦點。

    ...
        cardView.setFocusable(true);
        cardView.setFocusableInTouchMode(true);
        return new ViewHolder(cardView);
    }

當用戶選擇 ImageCardView 時,它會展開以顯示其文本區(qū)域(該區(qū)域以您指定的顏色為背景顏色)冯勉,如圖 1 所示。

這里需要解釋下ArrayObjectAdapter摹芙、Presenter灼狰、數(shù)據(jù)源ImageCardView之間的關系。

  • ArrayObjectAdapter其實就是對一組數(shù)據(jù)源進行管理浮禾,例如添加交胚、更新等;
    -Presenter創(chuàng)建Item的視圖盈电,這里是ImageCardView蝴簇,并將數(shù)據(jù)源與視圖進行綁定;
  • Presenter必須作為ArrayObjectAdapter構造方法的參數(shù)匆帚,這樣Presenter才能根據(jù)ArrayObjectAdapter添加的數(shù)據(jù)源生成對應的視圖

本文主要介紹了如何利用ImageCardView熬词、PresenterArrayObjectAdapter顯示媒體列表,下一篇介紹利用DetailsSupportFragment顯示媒體詳細信息吸重。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末互拾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嚎幸,更是在濱河造成了極大的恐慌颜矿,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫉晶,死亡現(xiàn)場離奇詭異骑疆,居然都是意外死亡,警方通過查閱死者的電腦和手機替废,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門箍铭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人椎镣,你說我怎么就攤上這事坡疼。” “怎么了衣陶?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵柄瑰,是天一觀的道長。 經(jīng)常有香客問我剪况,道長教沾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任译断,我火速辦了婚禮授翻,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己堪唐,他們只是感情好巡语,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淮菠,像睡著了一般男公。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上合陵,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天枢赔,我揣著相機與錄音,去河邊找鬼拥知。 笑死踏拜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的低剔。 我是一名探鬼主播速梗,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼襟齿!你這毒婦竟也來了镀琉?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蕊唐,失蹤者是張志新(化名)和其女友劉穎屋摔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體替梨,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡钓试,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了副瀑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弓熏。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖糠睡,靈堂內(nèi)的尸體忽然破棺而出挽鞠,到底是詐尸還是另有隱情,我是刑警寧澤狈孔,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布信认,位于F島的核電站,受9級特大地震影響均抽,放射性物質發(fā)生泄漏嫁赏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一油挥、第九天 我趴在偏房一處隱蔽的房頂上張望潦蝇。 院中可真熱鬧款熬,春花似錦、人聲如沸攘乒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽则酝。三九已至殉簸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堤魁,已是汗流浹背喂链。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工返十, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妥泉,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓洞坑,卻偏偏與公主長得像盲链,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子迟杂,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354