当前位置: 首页 > 面试题库 >

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

卢锋
2023-03-14
问题内容

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

所述Recyclerview使用数据的每个项目的结合和我能够显示用Log长按当从所选择的项目数据。

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

那么如何显示对话框?

谢谢,Ove


问题答案:

从概念上讲,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);
            }
        }
    }
}


 类似资料:
  • 问题内容: 我正在寻找一种可靠的解决方案,以从Go连接到MySQL数据库。我已经看到了一些库,但是很难确定完整性和当前维护的不同状态。我没有复杂的需求,但是我想知道人们所依赖的是什么,或者连接到MySQL的最标准的解决方案是什么。 问题答案: 有一些驱动程序可用,但您应仅考虑将实现数据库/ sql API的驱动程序视为 它提供了一种干净高效的语法, 它确保您以后可以更改驱动程序而无需更改代码(导入

  • 来自库伯内特斯文档(从Pod访问API): 在pod中定位apiserver的推荐方法是使用kubernetes DNS名称,该名称解析为一个服务IP,该IP将被路由到一个apiserver。 但是,当我在OpenShift pod的shell中时,这个“kubernetes”dns名称似乎并不存在。由于 Kubernetes 在下面运行,我希望它默认存在,但我错了吗?这是使用OpenShift

  • 本文向大家介绍Oracle 11gR2中启动Scott用户的方法(推荐),包括了Oracle 11gR2中启动Scott用户的方法(推荐)的使用技巧和注意事项,需要的朋友参考一下 Oracle 中启动 Scott 用户 的方法 , 在 Oracle11gR2, (g 代表‘网络'的意思) 数据库中 Scott 这个用户 安装时是被锁定的, 安装 Oracle的时候 ,你可以直接选择 给该用户 解锁

  • 问题内容: 我有三个非常相似的控制器。我想要一个控制器,这三个控制器可以扩展并共享其功能。 问题答案: 也许 您 不扩展控制器,但是可以扩展控制器或将单个控制器混合为多个控制器。 创建父控制器后,其中的逻辑也将执行。有关更多信息,请参见$ controller(),但仅需要传递值。所有其他值将正常注入。 @mwarren ,Angular依赖注入自动解决了您的顾虑。您所需要做的就是注入$ scop

  • 问题内容: 由于标题已经声明不赞成使用JNLP连接,Jenkins还提供了一条消息和一个超链接 https://zh.wikipedia.org/wiki/Java_Web_Start#已弃用 因此,现在将WindowsSlave附加到Jenkins的推荐方法是什么,在https://jenkins.io上似乎没有关于该主题的真正好的指南。 问题答案: 有一个开源替代OpenWebStart这是基

  • 问题内容: 现在我正在使用类似 我需要您的意见以最好/最有效的方式对密码进行加密,当然,加密的密码应受PHP 7.xx支持,并且也应可解密,因为我的客户确实希望选择“恢复”密码而不生成新密码一。 问题答案: 最佳做法是对密码进行哈希处理,以使密码不可解密。这使可能已获得对数据库或文件的访问权限的攻击者的处境变得更加困难。 如果必须加密数据并使其可解密,请访问https://paragonie.co