2

サンプルを見ると、Android Architecture Componentsを使用してMVVMへの2つのアプローチが見られました。ViewModel + Data Bindingのベストプラクティスとパターン。 ViewModelのObservableFieldは問題ありませんか?

最初のアプローチ:Activityと呼ばれる観察者がViewModelObservableFieldにデータを設定された場合

  1. ViewModelLiveData
  2. LiveData
  3. Activity加入を提供します。
  4. ViewModel全体を結合に通す。私はViewModellistLoadingObservableFieldなどを更新するように私は、状態(例えば、 "ロード")を渡す必要はありません:
  5. xmlであなただけの値としてObservableField

    <ProgressBar 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center" 
        app:visibleGone="@{viewmodel.listLoading}"/> 
    
    <android.support.v4.widget.SwipeRefreshLayout 
        android:id="@+id/swiperefresh" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        app:refreshing="@{viewmodel.listRefreshing}" 
        app:onRefreshListener="@{() -> viewmodel.refreshList()}" 
        app:visibleGone="@{!viewmodel.listLoading}"> 
    

賛否を設定しましたこの:

val listLoading = ObservableBoolean(false) 
/** other observable fields go here **/ 

val list: MutableLiveData<List<Item>> = MutableLiveData() 

    fun loadList() { 
     listLoading.set(true) 
     repo.getList { items -> 
      list.value = items 
      listLoading.set(false) 
     } 
    } 

短所:このアプローチに問題はありますか?

第二のアプローチ:観察者はActivity

  • のみ必要オブジェクト(POJO)を結合に渡されると呼ばれるとき

    1. ViewModelLiveData
    2. LiveData
    3. Activity加入を提供するには、
    結合に渡されます。

    長所:このアプローチの賛否両論?

    短所:状態はViewModelから返されます。このsample from Googleのデータは、Resourceオブジェクトにラップされています。

    最初のアプローチは、私はAndroidのデータバインディングとAndroidアーチコンポーネントでの作業より多くの経験を持つ開発者からの両方のパターンの長所と短所が何であるかを知っていただきたいと思いanother sample app from Google

    に使用されています。

  • +0

    これらの質問の最後の言葉ですか?私は第2のアプローチを使用したいが、まだ混乱している。どんな助け? – iMDroid

    答えて

    4

    ビューロジックをビジネスロジックで分割することを検討する必要があります。

    データバインディングとAACを使用してViewModelを処理するため、ビュー(レイアウト)内のロジックを分離する必要があります。

    レイアウトに2つの変数を渡すだけです。 1つは、ボタンを押してロジックを処理するなどのビジネスロジックを処理するVievModelです。もう1つはView(フラグメント)です。

    その後、あなたは

    app:onRefreshListener="@{() -> yourViewFragment.refreshList()}" 
    

    を使用して、現在、ビュー、サブスクライブがない場合は、「文脈漏れ」もしくは動作しない解決策を避けることができます。

    onRefreshListenerはフラグメントにバインドされているため、フラグメント内でそれを渡すことができます。

    LiveDataまたはObservableFieldをViewModel内に作成して、その種の操作を処理すると、その断片を一時停止して再開するとLiveDataを再度観察することになります。つまり、最後に配信されたデータが再度配信されます。 ViewModelにに使用することができます

    例:

    <Textview ... name="@{viewModel.dataOfYourModel}" onClick="@{viewModel.doNetworkCall}" /> 
    

    ゴールデンルール:すべてのパッケージ/インポートアンドロイドで始まる* android.arch除くのviewmodel内にないする必要があります*コンポーネント。。

    関連する問題