从ViewModel启动DialogFragment的推荐方法是什么?

我在Recyclerview有一个列表对象。 长按项目时,我想显示一个对话框,其中包含项目中的数据。

Recyclerview正在为每个项目使用数据绑定,并且我可以在长按时使用Log显示所选项目中的数据。

但是,在尝试显示对话框时,您需要访问不建议在ViewModel对象中使用的Activity

那我怎么能显示对话框呢?

谢谢,Ove

从概念上讲,ViewModel让我觉得从错误的位置启动Dialog。 为了更清楚地做到这一点,我将RecyclerView.ViewHolder传递到布局中,并在ViewHolder上有一个方法,在RecyclerView.Adapter上触发自定义侦听器。 然后,任何订阅该侦听器(Activity / Fragment)的人都可以启动Dialog。 可能看起来有点回旋,但我不认为列表项的ViewModel应该知道或控制其环境。

这是一个例子。 这是使用数据绑定和ViewModel处理RecyclerView项目点击的一般模式。 这不是一个完整的例子,只是突出显示这种特定模式的代码。

布局:

        

适配器:

 class MyAdapter extends RecyclerView.Adapter { public interface SelectionListener { void onSelectionChanged(int newPosition, ViewModel viewModel); } private @NonNull WeakReference selectionListener = new WeakReference<>(null); public void setSelectionListener(@Nullable SelectionListener listener) { selectionListener = new WeakReference<>(listener); } public class ViewHolder extends RecyclerView.ViewHolder { 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); } } } } 

请参阅数据绑定库的官方文档的“ 变量”部分。 在那里,您可以找到可以使用的变量context

根据需要生成名为context的特殊变量以用于绑定表达式。 context的值是来自根View的getContext()的Context。 上下文变量将被具有该名称的显式变量声明覆盖。

基本上你可以将它传递给另一个变量,如viewModel ,从那里显示对话框。

 android:onClick="@{v -> viewModel.showDialog(context)}" 

因此,您可以使用item的上下文(例如AlertDialog itemView.getContext()来显示AlertDialog

来自Bayoudh的提示让我朝着正确的方向前进,但是我发布了这个以便将各个部分放在一起。 以下是可点击的cardview。 由于我的ViewModel没有对活动的引用,因此我们必须将有问题的视图作为参数传递。

  

android:onClick="@{(view) -> viewModel.onClick(view)}"语句将当前视图作为参数,因此您可以在ViewModel中使用它来获取view.getContext()上下文。