从概念上讲,ViewModel使我误认为是启动Dialog的错误位置。为了更简洁地执行此 *** 作,我将把RecyclerView.ViewHolder传递到布局中,并在ViewHolder上有一个方法来触发RecyclerView.Adapter上的自定义侦听器。然后,订阅该侦听器(活动/片段)的任何人都可以启动对话框。似乎有些round回,但是我不认为列表项的ViewModel应该了解或控制其环境。
这是一个例子。这是处理带有数据绑定和ViewModel的RecyclerView项目点击的常规模式。这不是一个完整的示例,仅是突出显示此特定模式的代码。
布局:
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" > <data> <variable name="viewHolder" type="com.example.ViewHolder" /> <variable name="viewModel" type="com.example.ViewModel" /> </data> <com.example.View android:layout_width="match_parent" android:layout_height="24dp" android:onClick="@{() -> viewHolder.onClick(viewModel)}" /></layout>
适配器:
class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { public interface SelectionListener { void onSelectionChanged(int newPosition, ViewModel viewModel); } private @NonNull WeakReference<SelectionListener> selectionListener = new WeakReference<>(null); public void setSelectionListener(@Nullable SelectionListener listener) { selectionListener = new WeakReference<>(listener); } public class ViewHolder extends RecyclerView.ViewHolder<ViewBinding> { ViewHolder(ViewBinding binding) { super(binding.getRoot()); binding.setViewHolder(this); binding.setViewModel(new ViewModel()); } public void onClick(ViewModel viewModel) { SelectionListener listener = selectionListener.get(); if (listener != null) { listener.onSelectionChanged(getAdapterPosition(), viewModel); } } }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)