Android Studio V3.12環(huán)境下TV開發(fā)教程
(轉(zhuǎn)自Android官網(wǎng)https://developer.android.com/training/tv/start)
文章源自:光谷佳武 https://blog.csdn.net/jiawuhan/article/details/80619656
在上一課中罪裹,您創(chuàng)建了一個目錄瀏覽器,該瀏覽器在瀏覽片段中實施,顯示媒體項目列表量没。?在本課中降传,您將為媒體項目創(chuàng)建卡片視圖并將其顯示在瀏覽片段中舶治。
BaseCardView類和子類顯示與媒體項目關(guān)聯(lián)的元數(shù)據(jù)琼讽。?ImageCardView使用的ImageCardView類顯示內(nèi)容的圖像以及媒體項目的標題熔萧。
本課介紹來自Android Leanback示例應(yīng)用程序的代碼糖驴,可在GitHub上找到僚祷。?使用此示例代碼來啟動您自己的應(yīng)用程序。
圖1.選擇Leanback示例應(yīng)用程序圖像卡視圖贮缕。
Presenter生成視圖并根據(jù)需要將對象綁定到它們辙谜。?在應(yīng)用程序向用戶展示其內(nèi)容的瀏覽片段中,您將為內(nèi)容卡創(chuàng)建一個Presenter并將其傳遞給將內(nèi)容添加到屏幕的適配器感昼。?在以下代碼中装哆,?CardPresenter在LoaderManager的onLoadFinished()回調(diào)中創(chuàng)建。
@Overridepublic void onLoadFinished(Loader>> arg0,? ? ? ? ? ? ? ? ? ? ? ? ? ?HashMap> data) {? ? mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());? ? CardPresenter cardPresenter = new CardPresenter();? ? int i = 0;? ? for (Map.Entry> entry : data.entrySet()) {? ? ? ? ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);? ? ? ? List list = entry.getValue();? ? ? ? for (int j = 0; j < list.size(); j++) {? ? ? ? ? ? listRowAdapter.add(list.get(j));? ? ? ? }? ? ? ? HeaderItem header = new HeaderItem(i, entry.getKey(), null);? ? ? ? i++;? ? ? ? mRowsAdapter.add(new ListRow(header, listRowAdapter));? ? }? ? HeaderItem gridHeader = new HeaderItem(i, getString(R.string.more_samples),? ? ? ? ? ? null);? ? 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));? ? mRowsAdapter.add(new ListRow(gridHeader, gridRowAdapter));? ? setAdapter(mRowsAdapter);? ? updateRecommendations();}
在此步驟中定嗓,您使用卡片視圖的視圖持有人構(gòu)建卡片演示者蜕琴,以描述您的媒體內(nèi)容項目。?請注意宵溅,每個演示者只能創(chuàng)建一個視圖類型凌简。?如果您有兩種不同的卡片視圖類型,則需要兩個不同的卡片演示者恃逻。
在Presenter?雏搂,實現(xiàn)一個onCreateViewHolder()回調(diào),該回調(diào)創(chuàng)建一個可用于顯示內(nèi)容項的視圖持有者寇损。
@Overridepublic class CardPresenter extends Presenter {? ? private Context mContext;? ? private static int CARD_WIDTH = 313;? ? private static int CARD_HEIGHT = 176;? ? private Drawable mDefaultCardImage;? ? @Override? ? public ViewHolder onCreateViewHolder(ViewGroup parent) {? ? ? ? mContext = parent.getContext();? ? ? ? mDefaultCardImage = mContext.getResources().getDrawable(R.drawable.movie);...
在onCreateViewHolder()方法中畔派,為內(nèi)容項目創(chuàng)建一個卡片視圖。?以下示例使用ImageCardView?润绵。
選擇卡時,默認行為會將其展開為較大的尺寸胞谈。?如果您想為選定的卡指定不同的顏色尘盼,請按此處所示調(diào)用setSelected()?。
...? ? ImageCardView cardView = new ImageCardView(mContext) {? ? ? ? @Override? ? ? ? public void setSelected(boolean selected) {? ? ? ? ? ? int selected_background = mContext.getResources().getColor(R.color.detail_background);? ? ? ? ? ? int default_background = mContext.getResources().getColor(R.color.default_background);? ? ? ? ? ? int color = selected ? selected_background : default_background;? ? ? ? ? ? findViewById(R.id.info_field).setBackgroundColor(color);? ? ? ? ? ? super.setSelected(selected);? ? ? ? }? ? };...
當用戶打開您的應(yīng)用程序時烦绳,?Presenter.ViewHolder會顯示您的內(nèi)容項目的CardView對象卿捎。?您需要設(shè)置這些以通過調(diào)用setFocusable(true)和setFocusableInTouchMode(true)從D-pad控制器接收焦點。
...? ? cardView.setFocusable(true);? ? cardView.setFocusableInTouchMode(true);? ? return new ViewHolder(cardView);}
當用戶選擇ImageCardView?径密,它會展開以顯示您指定背景顏色的文本區(qū)域午阵,如圖1所示。