Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 观察RecyclerView(架构组件)的每个元素_Android_Android Recyclerview_Android Databinding_Android Architecture Components - Fatal编程技术网

Android 观察RecyclerView(架构组件)的每个元素

Android 观察RecyclerView(架构组件)的每个元素,android,android-recyclerview,android-databinding,android-architecture-components,Android,Android Recyclerview,Android Databinding,Android Architecture Components,我试图找出创建元素列表(每个元素使用数据绑定来设置数据)并观察每个元素的变化的最佳方法。实际上,我有一个带有MutableLiveData列表的ViewModelMutableLiveData 问题是,在每个元素中都有像上载文件或输入密码这样的操作,因此一旦操作完成或加载时,我必须更改UI。我在RecyclerView适配器中尝试了notifyItemChanged,但动画效果非常差,最好使用executePendingBindings 是否有人认为这是解决此问题的最佳方法?如果使用equals

我试图找出创建元素列表(每个元素使用数据绑定来设置数据)并观察每个元素的变化的最佳方法。实际上,我有一个带有MutableLiveData列表的ViewModel
MutableLiveData

问题是,在每个元素中都有像上载文件或输入密码这样的操作,因此一旦操作完成或加载时,我必须更改UI。我在RecyclerView适配器中尝试了
notifyItemChanged
,但动画效果非常差,最好使用
executePendingBindings


是否有人认为这是解决此问题的最佳方法?

如果使用equals,则对象必须正确重写对象#equals()。 此处错误地返回false将导致动画过多

 public static final DiffCallback<User> DIFF_CALLBACK = new DiffCallback<User>() {
            @Override
            public boolean areItemsTheSame(@NonNull User oldUser, @NonNull User newUser) {
                // User properties may have changed if reloaded from the DB, but ID is fixed
                return oldUser.getId() == newUser.getId();
            }
            @Override
            public boolean areContentsTheSame(@NonNull User oldUser, @NonNull User newUser) {
                // NOTE: if you use equals, your object must properly override Object#equals()
                // Incorrectly returning false here will result in too many animations.
                return oldUser.equals(newUser);
            }
public static final DiffCallback DIFF_CALLBACK=new DiffCallback(){
@凌驾
公共布尔项是相同的(@NonNull User oldUser,@NonNull User newUser){
//如果从数据库重新加载,则用户属性可能已更改,但ID是固定的
返回oldUser.getId()==newUser.getId();
}
@凌驾
公共布尔值是相同的内容(@NonNull User oldUser,@NonNull User newUser){
//注意:如果使用equals,则对象必须正确重写对象#equals()
//此处错误地返回false将导致动画过多。
返回oldUser.equals(newUser);
}
用户类如下所示

public class UserInfo{
    @PrimaryKey
    @NonNull
    private String number;

    private String name;

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public UserInfo(String number, String name) {
        this.number = number;
        this.name = name;
    }



    @Override
    public boolean equals(Object obj) {
        if (obj == this)
            return true;

        UserInfo user = (UserInfo) obj;

        return user.number == this.number && user.name == this.name;
    }


    public static DiffCallback<UserInfo> DIFF_CALLBACK = new DiffCallback<UserInfo>() {
        @Override
        public boolean areItemsTheSame(@NonNull UserInfo oldItem, @NonNull UserInfo newItem) {
            return oldItem.number.equals(newItem.number);
        }

        @Override
        public boolean areContentsTheSame(@NonNull UserInfo oldItem, @NonNull UserInfo newItem) {
            // If this comparisons  wrong then to many UI changes in RecycleView
            return oldItem.equals(newItem);
        }

        @Override
        public Object getChangePayload(@NonNull UserInfo oldItem, @NonNull UserInfo newItem) {
            return super.getChangePayload(oldItem, newItem);
        }
    };
}
公共类用户信息{
@主键
@非空
私有字符串编号;
私有字符串名称;
公共字符串getNumber(){
返回号码;
}
公共无效集合号(字符串号){
这个数字=数字;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共用户信息(字符串编号、字符串名称){
这个数字=数字;
this.name=名称;
}
@凌驾
公共布尔等于(对象obj){
如果(obj==此)
返回true;
UserInfo user=(UserInfo)obj;
返回user.number==this.number&&user.name==this.name;
}
公共静态DiffCallback DIFF_CALLBACK=new DiffCallback(){
@凌驾
公共布尔值AreItemsSame(@NonNull UserInfo oldItem,@NonNull UserInfo newItem){
返回oldItem.number.equals(newItem.number);
}
@凌驾
公共布尔值是相同的内容(@NonNull UserInfo oldItem,@NonNull UserInfo newItem){
//如果这种比较是错误的,那么在RecycleView中的许多UI更改
返回oldItem.equals(newItem);
}
@凌驾
公共对象getChangePayload(@NonNull UserInfo oldItem,@NonNull UserInfo newItem){
返回super.getChangePayload(oldItem,newItem);
}
};
}

请参考什么是
动画真的很糟糕,
真正的意思是什么?元素的高度取决于元素的状态,因为我隐藏或显示了元素内部的视图。因此,当我使用
notifyItemChanged
时,元素以一种奇怪的方式调整大小,而
executePendingBindings
使动画完美