在上一篇文章中痒芝,我們利用BrowseSupportFragment
創(chuàng)建了一個目錄瀏覽器侠驯,其中顯示了一個媒體項列表兄纺。在本課中着降,您將為媒體項創(chuàng)建卡片視圖(ImageCardView
),并在BrowseSupportFragment
中呈現(xiàn)它們泳炉。
BaseCardView
類及其子類顯示與媒體項關聯(lián)的元數(shù)據(jù)私蕾。本文中使用的 ImageCardView
類可顯示內(nèi)容的圖像以及媒體項的標題。
本課中所介紹的代碼來自 Android TV GitHub 代碼庫中的 Android Leanback 示例應用胡桃。您可借助此示例代碼開始編寫自己的應用踩叭。
創(chuàng)建卡片 Presenter
Presenter
生成視圖并根據(jù)需要為視圖綁定對象翠胰。在應用向用戶呈現(xiàn)內(nèi)容的瀏覽 Fragment 中容贝,您可以為內(nèi)容卡片創(chuàng)建一個 Presenter
,并將其傳遞給將內(nèi)容添加到屏幕的 Adapter之景。在以下代碼中斤富,在 LoaderManager
的 onLoadFinished()
回調(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
熬词、Presenter
和ArrayObjectAdapter
顯示媒體列表,下一篇介紹利用DetailsSupportFragment
顯示媒體詳細信息吸重。