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

标签 java android mvvm android-databinding

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

Recyclerview 为每个项目使用数据绑定(bind),我可以在长按时使用 Log 显示所选项目的数据。

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

那么如何显示对话框呢?

谢谢,欧维

最佳答案

从概念上讲,我认为 ViewModel 是启动对话框的错误位置。为了更干净地做到这一点,我会将 RecyclerView.ViewHolder 传递到布局中,并在 ViewHolder 上有一个方法来触发 RecyclerView.Adapter 上的自定义监听器。然后订阅该监听器( Activity/fragment )的任何人都可以启动对话框。可能看起来有点迂回,但我认为列表项的 ViewModel 不应该了解或控制其环境。

这是一个例子。这是使用数据绑定(bind)和 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);
            }
        }
    }
}

关于java - 从 ViewModel 启动 DialogFragment 的推荐方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42783116/

相关文章:

Java 多次按钮单击

java - "telephonyService cannot be resolved"方法调用出现错误 `telephonyService.answerRingingCall();`

android - 整个应用程序中的全局 "search function"

c# - 如何验证 MVVM 样式中的错误数据类型?

java - Hibernate中的Join及其使用

android - Android 上的 OpenGL ES 1.x 入门 - 基本原语

android - 为什么 setVisibility 会导致 NullPointerException?

wpf - 列表项目选择无法正常工作?

c# - WPF DataGrid CurrentItem 为空

java - 如果我想在 java servlet 中解析它,我应该在哪里找到 xml 文件