8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AndroidTV:ObjectAdapter, Presenter

Posted at

*本稿はAndroid L Developer Previewの情報がベース. 正式版で変更される可能性に注意
開発環境: AndroidStudio v0.8.3

Blog: Yukiの枝折: AndroidTV:ObjectAdapter, Presenter

Introduction

Android leanback support libraryには, メディアコンテンツを閲覧表示するためのAPIが備わっている.
ここではObjectAdapterPresenterについて記載する.

Overview

Android leanback support libraryはコンテンツ(Model)と表示(View)の責務を分離するPresenterの仕組みを提供する.
またModelとPresenterの接続役となるObjectAdapterも提供される.

ObjectAdapterはデータ(メディアコンテンツ等)と, PresenterSelectorを内包する抽象クラス.
BrowserFragment, DetailsFragment(あるいはそれらのサブクラス)のsetAdapter(ObjectAdapter)でObjectAdapterを登録する.
PresenterSelectorはModel毎に最適なPresenterを選択し, PresenterがこれをViewにバインドする.

###Model-View-Presenter Pattern
本稿についてはModel-View-Presenter Patternについて知っておくと理解が早い.

enter image description here
[MVP Pattern.]

AndroidTVでは, メディアコンテンツがModelに, PresenterがPresenterに, ViewがViewにそれぞれ対応する.
ObjectAdapterはModelとPresenterを対応づけるアダプタとして作用する.

APIs

###ObjectAdapter
android.support.v17.leanback.widget.ObjectAdapter

####Class Overview

Adapter for leanback activities. Provides access to a data model and is decoupled from the presentation of the items via PresenterSelector.

Leanback Activity用のAdapter. Modelへのアクセス手段を提供し, PresenterSelectorでModelとViewを分離する.

ObjectAdapterは抽象クラスであり, Modelを管理する手段を提供しない.
ModelをArrayListで管理する場合はサブクラスのArrayObjectAdapterを使用する.

// Set Presenter
ArrayObjectAdapter adapter =
        new ArrayObjectAdapter(new MyStringPresenter());

// Add Models
adapter.add("Media Item 1");
adapter.add("Media Item 2");
adapter.add("Media Item 3");

ObjectAdapterにPresenterSelectorを設定する主な方法は次の3パターン.

  1. ObjectAdapterのコンストラクタ引数にPresenterSelectorインスタンスを渡す
  2. ObjectAdapterのコンストラクタ引数にPresenterインスタンスを渡す
  3. ObjectAdapter.setPresenterSelectorメソッドでPresenterSelectorをセットする
// 1. Set Presenter
ArrayObjectAdapter adapter1 = new ArrayObjectAdapter(
        new MyStringPresenter());

// 2. Set PresenterSelector
ArrayObjectAdapter adapter2 = new ArrayObjectAdapter(
        new SinglePresenterSelector(new MyStringPresenter()));

// 3. Lazy initialize
ArrayObjectAdapter adapter3 = new ArrayObjectAdapter();
adapter3.setPresenterSelector(
        new SinglePresenterSelector(new MyStringPresenter()));

####Summary
下記は主なAPI.

ObjectAdapter(PresenterSelector presenterSelector)
: > Construct an adapter with the given PresenterSelector.
: Adapterを初期化し, PresenterSelectorを設定する

ObjectAdapter(Presenter presenter)
: > Construct an adapter that uses the given Presenter for all items.
: Adapterを初期化し, 全てのリスト項目にPresenterを使用する.内部的にはSinglePresenterSelectorが設定される.

ObjectAdapter.DataObserver
: > A DataObserver can be notified when an ObjectAdapter's underlying data changes.
: DataObserverはObjectAdapterのデータに変更があった場合に通知を受け取ることができる

get(int position)
: > Returns the item for the given position.
: 引数positionに位置するitem(Model)を返却

getId(int position)
: > Returns id for the given position.
: 引数positionに位置するidを返却

getPresenter(Object item)
: > Returns the Presenter for the given item from the adapter.
: item(Model)に対応するPresenterを返却

setPresenterSelector(PresenterSelector presenterSelector)
: > Set the presenter selector.
: PresenterSelectorを設定する


###PresenterSelector
android.support.v17.leanback.widget.PresenterSelector

####Class Overview

A PresenterSelector is used to obtain a Presenter for a given Object.

PresenterSelectorは対象Modelに対応するPresenterを取得するために使用される.

ObjectAdapterがModelをViewへバインドするためのPresenterの選択に使用される.
Presenterオブジェクトを取得するために使用される基本的なPresenterSelectorは次の通り.

  • ClassPresenterSelector
  • SinglePresenterSelector

####Summary
getPresenter(Object item)
: > Returns a presenter for the given item.
: item(Model)に対応するPresenterを返却する.


###SinglePresenterSelector
android.support.v17.leanback.widget.PresenterSelector
 ┗ndroid.support.v17.leanback.widget.SinglePresenterSelector

####Class Overview
常に同じPresenterを返すPresenterSelector. Modelが全て同じタイプである場合に使用する.

public final class SinglePresenterSelector extends PresenterSelector {
    private final Presenter mPresenter;

    public SinglePresenterSelector(Presenter presenter) {
        mPresenter = presenter;
    }

    @Override
    public Presenter getPresenter(Object item) {
        return mPresenter;
    }
}

####Summary
SinglePresenterSelector(Presenter presenter)
: > The Presenter to return for every item.
: 全てのModel共通で使用されるPresenterを指定して初期化

getPresenter(Object item)
: > Returns a presenter for the given item.
: 指定されたitem(Model)に対応するPresenterを返却する. 常に同じPresenterを返却する.


###ClassPresenterSelector
android.support.v17.leanback.widget.PresenterSelector
 ┗android.support.v17.leanback.widget.ClassPresenterSelector

####Class Overview
Modelの内容に基づいてPresenterクラスを切り替えたい場合に使用する.
ClassPresenterSelectorはClassをキーに持つMapでPresenterを管理する.

public final class ClassPresenterSelector extends PresenterSelector {
    private final HashMap<Class<?>, Presenter> mClassMap = new HashMap<Class<?>, Presenter>();

    public void addClassPresenter(Class<?> cls, Presenter presenter) {
        mClassMap.put(cls, presenter);
    }

    @Override
    public Presenter getPresenter(Object item) {
        // item.getClass() にマッチするPresenterをmClassMapから見つけ出し返却する
    }
}

####Summary
addClassPresenter(Class> cls, Presenter presenter)
: > (no description)
: Modelの型に対応するPresenterを登録する

getPresenter(Object item)
: > Returns a presenter for the given item.
: 指定されたitem(Model)に対応するPresenterを返却する.


###Presenter
android.support.v17.leanback.widget.Presenter

####Class Overview

A Presenter is used to generate Views and bind Objects to them on demand. It is closely related to concept of an RecyclerView.Adapter, but is not position-based.

PresenterはViewを生成しObjectをバインドする.
これはRecyclerview.Adapterのコンセプトと近似しているがpositionベースではない.

A trivial Presenter that takes a string and renders it into a TextView:

下記はPresenterがStringを受け取りそれをTextViewにレンダリングするコード:

public class StringTextViewPresenter extends Presenter {
    // This class does not need a custom ViewHolder, since it does not use
    // a complex layout.
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent) {
        return new ViewHolder(new TextView(parent.getContext()));
    }
    
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, Object item) {
        String str = (String) item;
        TextView textView = (TextView) viewHolder.mView;
        textView.setText(item);
    }
    
    @Override
    public void onUnbindViewHolder(ViewHolder viewHolder) {
        // Nothing to unbind for TextView, but if this viewHolder had
        // allocated bitmaps, they can be released here.
    }
}

####Summary
主なAPIは下記.

onBindViewHolder(Presenter.ViewHolder viewHolder, Object item)
: > Binds a View to an item.
: item(Model)をViewにバインドする

onCreateViewHolder(ViewGroup parent)
: > Creates a new View.
: 新しいViewを作成する

onUnbindViewHolder(Presenter.ViewHolder viewHolder)
: > Unbinds a View from an item. Any expensive references may be released here, and any fields that are not bound for every item should be cleared here.
: Viewからitem(Model)をアンバインドする. Viewにバインドされていないものも含め強参照はここでリリースされるべき.


###Presenter.ViewHolder
android.support.v17.leanback.widget.Presenter.ViewHolder

####Class Overview

ViewHolder can be subclassed and used to cache any view accessors needed to improve binding performance (for example, results of findViewById) without needing to subclass a View.

ViewHolderはサブクラス化することができる.(その他は一般的なViewHolderと同じ)

####Summary
特記事項なし


License:
Portions of this page are modifications based on work created and shared by the Android Open Source Project
and used according to terms described in the Creative Commons 2.5 Attribution License.

"Model View Presenter GUI Design Pattern" by Google
http://www.gwtproject.org/articles/testing_methodologies_using_gwt.html
Licensed under Creative Commons Attribution-Share Alike 3.0 via Wikimedia Commons -
http://commons.wikimedia.org/wiki/File:Model_View_Presenter_GUI_Design_Pattern.png#mediaviewer/File:Model_View_Presenter_GUI_Design_Pattern.png

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?