Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.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
Java 回收视图和x2B中的项目;Listadapter赢得';更新时重新绘制_Java_Android_Android Recyclerview_Android Listadapter - Fatal编程技术网

Java 回收视图和x2B中的项目;Listadapter赢得';更新时重新绘制

Java 回收视图和x2B中的项目;Listadapter赢得';更新时重新绘制,java,android,android-recyclerview,android-listadapter,Java,Android,Android Recyclerview,Android Listadapter,我正在设置一个RecyclerView,它使用ListAdapter计算更改时的动画。RecyclerView通过ViewModel接收数据,ViewModel通过Firebase获取列表。显示的项目属于门萨类型。Mensa项目可以更改其可见性、占用率或显示的距离 我想实现两个按钮,用于收藏/隐藏项目,从而更改它们在列表中的位置。每个项目中的两个按钮允许用户收藏或隐藏项目。这将根据排序策略将项目移动到列表的顶部/底部,排序策略将收藏夹放在第一位,默认值放在第二位,隐藏项放在最后 但是,当我单击按

我正在设置一个RecyclerView,它使用ListAdapter计算更改时的动画。RecyclerView通过ViewModel接收数据,ViewModel通过Firebase获取列表。显示的项目属于门萨类型。Mensa项目可以更改其可见性、占用率或显示的距离

我想实现两个按钮,用于收藏/隐藏项目,从而更改它们在列表中的位置。每个项目中的两个按钮允许用户收藏或隐藏项目。这将根据排序策略将项目移动到列表的顶部/底部,排序策略将收藏夹放在第一位,默认值放在第二位,隐藏项放在最后

但是,当我单击按钮时,列表将重新排列,但单击的项目不会重新绑定。按钮保留其旧状态(和OnClickListeners),只有滚动列表才会调用onBind方法。我的DiffUtil.Callback有问题吗?我真的不知道我的代码出了什么问题

我已经在适配器的submitList方法中提供了一个新列表(在我的例子中,这个建议来自另一个启用stackoverflow问题的动画),但是单击的项目仍然不会重新绘制

在MensaListActivity.java中

@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u mensa\u列表);
viewModel=ViewModelProviders.of(this.get)(MensaListModel.class);
最终回收视图回收视图=findViewById(R.id.mensa\u列表\u回收视图);
final mensalistapter adapter=new mensalistapter(这个,new mensalistapter.ItemButtonsListener(){
@凌驾
公共无效可见性按钮勾选(Mensa Mensa,VisibilityReference newVisibility){
viewModel.visibilityChanged(mensa,newVisibility);
}
});
recyclerView.setAdapter(适配器);
recyclerView.setHasFixedSize(false);
setLayoutManager(新的GridLayoutManager(this,1,recyclerView.VERTICAL,false));
viewModel.getMensaData().observe(这个,新的观察者(){
@凌驾
更改后的公共无效(LinkedList mensas){
adapter.submitList(新链接列表(mensas));
}
});
在MensaListModel.java中

public LiveData getMensaData(){
返回门萨达塔;
}
// ...
公共无效可见性已更改(Mensa changedItem,VisibilityReference newVisibility){
LinkedList newData=getMensaData().getValue();
int index=newData.indexOf(changedItem);
newData.remove(索引);
newData.add(changedItem);
sortMensaData(新数据);
//sortMensaData调用postValue方法
MensaListAdapter.java

public类MensaListAdapter扩展了ListAdapter{
私有最终项按钮侦听器;
私人最终语境;
类MensaViewHolder扩展了RecyclerView.ViewHolder{
文本视图名称标签;
文本视图地址标签;
TextView restaurantTypeLabel;
TextView职业标签;
文本视图距离标签;
图像按钮偏好按钮;
图像按钮隐藏按钮;
公共MensaViewHolder(@NonNull视图itemView){
超级(项目视图);
//一堆作业
}
公共数据(最终门萨-纽门萨){
namelab.setText(newMensa.getName());
addressLabel.setText(newMensa.getAddress());
restaurantTypeLabel.setText(newMensa.getType().toString());
String occText=“occupation:+newMensa.getoccupation().toInt();
职业标签设置文本(occText);
如果(newMensa.getDistance()!=-1){
distanceLabel.setVisibility(View.VISIBLE);
distanceLabel.setText(Double.toString(newMensa.getDistance());
}否则{
距离标签.setVisibility(视图.不可见);
}
开关(newMensa.getVisibility()){
案例收藏夹:
setImageDrawable(ResourcesCompat.getDrawable(context.getResources(),R.drawable.favorite_active,null));
favoriteButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
listener.visibilityButtonClicked(newMensa,VisibilityReference.DEFAULT);
}
});休息;
案例默认值:
setImageDrawable(ResourcesCompat.getDrawable(context.getResources(),R.drawable.favorite_inactive,null));
favoriteButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
listener.visibilityButtonClicked(newMensa,VisibilityReference.FAVORITE);
}
});休息;
隐藏的案例:
setImageDrawable(ResourcesCompat.getDrawable(context.getResources(),R.drawable.favorite_inactive,null));
favoriteButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
listener.visibilityButtonClicked(newMensa,VisibilityReference.FAVORITE);
}
});休息;
//删除了隐藏按钮分配,因为它们与favoritebutton分配相同
}
}
}
公共mensalistapter(上下文上下文,ItemButtonsListener侦听器){
超级(差异回调);
this.context=上下文;
this.listener=listener;
}
私有静态最终DiffUtil.Ite