Android 观察RecyclerView(架构组件)的每个元素
我试图找出创建元素列表(每个元素使用数据绑定来设置数据)并观察每个元素的变化的最佳方法。实际上,我有一个带有MutableLiveData列表的ViewModelAndroid 观察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
问题是,在每个元素中都有像上载文件或输入密码这样的操作,因此一旦操作完成或加载时,我必须更改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
使动画完美