web-dev-qa-db-ja.com

AndroidのMVPパターンでListViewを制御する方法

私は現在、MVPパターンを使用してAndroidアプリを開発しています。

アクティビティを開発しようとするときは、ListViewを使用する必要があります。だから私はListView用のアダプタを使用しています。しかし、AdapterはMVPパターンのPresenterに似ていると聞きました。

ApdaterがPresenterに似ている場合は、AdapterではなくListViewを更新するためにPresenterを作成する必要があると思います。

このような場合、ListViewを開発する方法は?アダプターを使用してMVPパターンを使い続けますか?

読んでくれてありがとう。

17
Originerd

はい、アダプタはMVPパターンのPコンポーネントである必要があります。実際、ListViewsはほとんどMVPとして記述されています。getView()関数は、呼び出されるたびにビューのすべての値を設定する必要があります。これは、プレゼンターが行う必要のあることのほぼ定義です。 MVCタイプの方法で使用するのも簡単ですが、モデルを渡すビューでgetView呼び出し関数を使用し、ビューでその作業を実行するだけです。したがって、実際にはどちらの方法でも機能します。好みを選択するだけです。

複雑なリスト行を持つMVPモデルを使用する場合は、listRow.findViewById(R.id.textView).setText(filename)を使用するのではなく、行をカスタム複合ビューにして、より説明的な関数名を配置するのが好きです。 listRow.setFilename(filename)に移動し、ビューにその処理方法を通知します。この種の方法では、MVPとMVCの境界が少し曖昧になりますが、アダプターの読みやすさと、純粋なMVCがもたらす厄介さの一部を回避することのバランスが取れていると思います。

2
Gabe Sechan

アダプターはビューの一部です。実際、すべてのAndroid依存関係はビューの一部である必要があります。アダプターをモデルから分離し、プレゼンターが使用するのは難しい作業です。 ライブラリをリリースしましたこの目的のためにPaperKnifeと呼ばれます。

PaperKnifeを使用して、アダプターをモデルおよびプレゼンターレイヤーから切り離すことができます。次の手順に従います。

  1. CellElementインターフェースを使用してモデルレイヤーを抽象化します。ビューレイヤーはモデルを知る必要はありません。

  2. 行ビューの情報を提供するクラスを作成します。プレゼンターを使用できます。クラスCellDataProviderを実装し、すべての情報を提供するメソッドを作成します。プロバイダーメソッドに@DataSource("DataId")アノテーションを付けて、マッピングを実行します。データメソッドは、モデルクラスのインスタンスを受け取ります。例えば:

    _public class SamplePresenterImpl implements SamplePresenter, CellDataProvider {
        @DataSource("Title")
        public String getTitle(Item item) {
            return item.getTitle();
        }
        // etc.
    }
    _
  3. アダプターにViewHolderを作成し、CellViewHolderインターフェースを実装します。ビューを管理するメソッドを作成し、DataTarget("DataId")を使用します

    _static class ViewHolder extends CellViewHolder {
        @DataTarget("Title")
        public String setTitle(String title) {
            mTextViewTitle.setText(title);
        }
    }
    _
  4. アダプタのgetViewメソッドでマッピングを実行します。

    _@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // etc.
        PaperKnife.map(mList.get(position))
                        .dataProvider(mCellDataProvider)
                        .into(viewHolder);
        return convertView;
    }
    _

このようにして、ビューレイヤーはCellElementインターフェイスを認識し、プレゼンターはアダプターにデータを提供する責任があります。

6
albertovecina

そのアクティビティにリストビューしかない場合、アダプタは実際にはリストビューのプレゼンターとして機能しているため、別のプレゼンターを作成する必要はありません。ただし、更新が必要なListView以外のUIコンポーネントがある場合は、それらのUIコンポーネント用に別のプレゼンターを作成する必要があります。

1
Yasir Ali

Androidアプリケーションは、基本的にModel-View-Controller(MVC)を中心に構築されています。MVPは同じように聞こえますが、この用語は聞いたことがありません。アクティビティはコントローラーの役割を果たします。XMLビューはまさにそれであり(ただし、アクティビティでプログラムで作成できます。XMLで作成する方が簡単で簡単です)、自分で作成したモデルです。そうです、そのモデルは非常に実用的です。

このデザインモデルについてあまり聞いたことがない理由として考えられるのは、Androidフレームワークでは、ビューを分離する必要があるためです。モバイルデバイス上のアプリケーションは小さい傾向があるため、人々はそうしません。フルオンMVCを使用する傾向があります。これらは、アクションレイヤーがモデルの(小さな)ジョブの多くを実行するビューレイヤーとアクションレイヤーに向かう傾向があります。

クロスプラットフォームアプリを作成している場合は、ビュー、アクション、ビジネスロジック、モデルの4層のアプローチを検討することをお勧めします。ビューレイヤーとアクションレイヤーはプラットフォーム固有ですが、ビジネスロジックとモデルは変更されません。基本的に、プレゼンターとユーザーの対話をアクションレイヤーに分割します。アクションレイヤーは、ビジネスロジックレイヤーを呼び出して、ユーザーが必要とするアクションを実行します。

0
The Holy Coder