2017-04-22 5 views
0

私は多くのアダプタとビュー、ビューモデルなどを持っています。それらを維持するのは難しいので、私はその場合にデータバインディングとmvvmを使いたいと思っています。今私は項目のクリックをビューモデルに転送しようとしました。そのrecycleview以来、私は素敵なメモリの使用量を少なくする機能を失うことはありません。データバインディングとMVVMを使用してRecycleViewでクリックをキャプチャするにはどうすればいいですか?

現在、私はViewModelを設定するビュー(Activity)を持っています。 ViewModel自体にはアダプタがあります。アダプターには、viewModelを受け取り、これを項目に設定するコンストラクターがあります。

アイテムはこれを使用してイベントをViewModelに戻します。どのようにメモリに影響を与えますか?これを行うより良い方法はありますか?以前はRXJavaを使っていましたが、これは同じコンセプトのようですね。ここに私のサンプルコード(切り詰められた)があります。

ビュー

public class ScenesFragment extends BaseFragment implements Observer { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    this.scenesFragmentBinding = DataBindingUtil.inflate(inflater, R.layout.scenes_fragment, container, false); 
    this.scenesListViewModel = new ScenesListViewModel(getContext()); 
    this.scenesFragmentBinding.setViewModel(this.scenesListViewModel); 

    View view = this.scenesFragmentBinding.getRoot(); 
    return view; 
} 

} 

たbaselayout

<layout ... > 
    <data><variable name="viewModel" type=".viewmodel.ScenesListViewModel"/></data> 
     <android.support.v7.widget.RecyclerView 
      app:adapter="@{viewModel.adapter}" 
      app:layoutManager="@{viewModel.layoutManager}" /> 
</layout> 

のViewModel

public class ScenesListViewModel extends Observable implements IViewModel { 

    public final SceneAdapter adapter; 
    private List<Scene> scenes = new ArrayList<>(); 

    public ScenesListViewModel(@NonNull Context context) { 
     this.adapter = new SceneAdapter(context, scenes, this); 
    } 

    public void onRemoveClick(Scene scene) { 
     Timber.d("Clicked remove in the scene:" + scene); 
    } 
} 

アイテムのレイアウト

<layout> 
    <data> 
     <variable name="scene"type=".model.Scene"/> 
     <variable name="viewModel" type=".viewmodel.ScenesListViewModel"/> 
    </data> 
       <ImageButton 
        android:id="@+id/sceneDelete" 
        android:layout_width="50dp" 
        android:layout_height="50dp" 
        android:layout_margin="15dp" 
        android:layout_weight="1" 
        android:background="@null" 
        android:onClick="@{() -> viewModel.onRemoveClick(scene)}" 
        android:src="@drawable/ic_delete_forever_white_48px"/> 
       </LinearLayout> 
    </layout> 

、最終的にはアイテムへのViewModelを設定するアダプタ。

アダプタ

public class SceneAdapter extends RecyclerView.Adapter<SceneAdapter.BindingHolder> { 
private Context context; 
private List<Scene> scenes; 
private ScenesListViewModel scenesListViewModel; 

public SceneAdapter(Context context, List<Scene> list, ScenesListViewModel scenesListViewModel) { 
    this.context = context; 
    this.scenes = list; 
    this.scenesListViewModel = scenesListViewModel; 
} 

@Override public void onBindViewHolder(SceneAdapter.BindingHolder holder, int position) { 
    final Scene scene = scenes.get(position); 
    holder.binding.setScene(scene); 
    holder.binding.setViewModel(scenesListViewModel); 
    holder.binding.executePendingBindings(); 
} 

それをやってもう一つの方法は、ViewModelににリスナーを設定することですが、これはその後、MVVM可能性が高いMVPです。 RXJavaをもう一度使用してアダプター内にSubjectを作成することもできますが、アンドロイドのオンボードツールで問題を解決したいと考えています。あなたのBindingHolderサブクラスで

答えて

-1

はonClickListener

class BindingHolder extends RecyclerView.ViewHolder 
    implements OnClickListener { 
     // code code code 
} 
@Override 
    public void onClick(View v) { 
     //code code code, use getAdapterPosition() to get the... adapter position 
    } 
} 
+0

ありがとう実装するが、これはデータバインディングで何もTODOを有し、その私が最後に書いた可能性のいずれかの方法。 –

関連する問題