【问题标题】:Call parent ViewModel from RecyclerView child ViewModel in Android从 Android 中的 RecyclerView 子 ViewModel 调用父 ViewModel
【发布时间】:2017-06-06 08:27:49
【问题描述】:

我有一个带有 RecyclerView 和 ViewModel 的 View,我有一个对象列表,我用一个 Adapter 和一个 ViewHolder 填充 RecyclerView。

每个对象都是一个 ViewModel,它有一个点击事件,该事件会转到详细信息,当点击事件触发时,应用程序会向服务器请求数据,如果数据正确,则会导航到详细信息屏幕。

我有一个“加载”检查以防止用户按两次同一个孩子,但由于每个孩子都有自己的视图模型实例,如果你按下快速不同的按钮(比服务器响应快)所有这些按钮被解雇了。

那么,是否有调用 RecyclerView 子视图模型的父视图模型或任何其他选项?其实我可以考虑做一个单例来保持孩子的加载状态。

【问题讨论】:

    标签: android mvvm android-recyclerview


    【解决方案1】:

    在您的视图模型中添加一个布尔属性,例如:isLoading,并在调用 web 服务时将其设置为 true,而 isLoading == true 禁用视图子级的点击事件。

    【讨论】:

    • 这是我第一次做的,但这只会阻止一个孩子对自己的召回,如果你按一个然后按另一个,第二个的视图模型布尔值是假的。
    • 你为你的viewholder设置了Tag了吗?
    • 嗯...不,我不这么认为
    • 我会将 isLoading 添加到数据模型中,并且只保留一项正在加载
    【解决方案2】:

    最后我使用的是一个带有 AtomicBoolean 的单例,如下所示:

    public final class LoadingStatusSingleton {
        private static final LoadingStatusSingleton ourInstance = new LoadingStatusSingleton();
    
        public static LoadingStatusSingleton getInstance() {
            return ourInstance;
        }
    
        private LoadingStatusSingleton() {
            isLoading = new AtomicBoolean(false);
        }
    
        private AtomicBoolean isLoading;
    
        public synchronized boolean getLoading() {
            return isLoading.get();
        }
    
        public synchronized void setLoading(boolean value) {
            isLoading.set(value);
        }
    }
    

    我根据不同视图模型实例的需要将 AtomicBoolean 更改为 true 或 false。

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 2018-05-21
      相关资源
      最近更新 更多