Ove*_*olt 7 java android mvvm android-databinding
我有一个列表对象Recyclerview.当长按一个项目时,我想显示一个对话框,其中包含单击该项目的数据.
所述Recyclerview使用数据对每个项目结合和我用Log长按时是能够显示从所选择的项目的数据.
但是,在尝试显示对话框时,您需要访问Activity,不建议在ViewModel对象中使用.
那么如何显示对话框?
谢谢,Ove
从概念上讲,ViewModel让我觉得从错误的位置启动Dialog.为了更清楚地做到这一点,我将RecyclerView.ViewHolder传递到布局中,并在ViewHolder上有一个方法,在RecyclerView.Adapter上触发自定义侦听器.然后,任何订阅该侦听器(Activity/Fragment)的人都可以启动Dialog.可能看起来有点迂回,但我不认为列表项的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>
Run Code Online (Sandbox Code Playgroud)
适配器:
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请参阅数据绑定库官方文档的变量部分。在那里你会找到一个context你可以使用的变量。
生成一个名为 context 的特殊变量,用于根据需要在绑定表达式中使用。context 的值是来自根视图的 Context
getContext()。上下文变量将被具有该名称的显式变量声明覆盖。
基本上你可以把它传递给另一个变量,比如viewModel从那里显示对话框。
android:onClick="@{v -> viewModel.showDialog(context)}"
Run Code Online (Sandbox Code Playgroud)