gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:20:59 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com