我的应用程序中出现了一个非常奇怪的错误。为了更清楚,我将创建一个带有减号的类似示例。
我正在使用 addListenerForSingleValueEvent
从 Firebase 实时数据库 读取对象。当我读取对象时,我将它们存储在一个数组中,我将其传递给 Recycleview 中的 Adapter。在这一点上,我可以说,经过调试后,一切似乎都可以正常工作。
然后在Adapter中,我有一个类似这样的代码:
public class AdapterObject extends RecyclerView.Adapter<AdapterObject.ViewHolder> {
ArrayList<Object> objectList;
Context mContext;
public AdapterObject (Context context, ArrayList<Object> objectList){
this.mContext = context;
this.objectList = objectList;
}
@NonNull
@Override
public AdapterObject.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.object_grid_layout, parent,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull AdapterObject.ViewHolder holder, int position) {
Object o = objectList.get(position);
Log.d("TAG", o.getAtribute());
if (o.getAtribute().equals("A")){
holder.atribute.setVisibility(View.VISIBLE);
}
@Override
public int getItemCount() {
return objectList.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView atribute;
boolean favorite;
String descuento, precioOriginal;
public ViewHolder(@NonNull View itemView) {
super(itemView);
atribute = itemView.findViewById(R.id.atribute);
}
}
}
正如你在代码中看到的,如果当前对象有属性值==“A”,则显示他的Textview,否则显示文本视图保持隐藏状态。
调试时一切似乎都正确,因为对象及其属性对应于数据库,但是当我在 Android 模拟器中部署应用程序并开始在 Recycleview 上上下移动时,持有者开始显示 Textviews 尽管控制台调试似乎是正确的...
这在 RecycleViews 中正常吗?我该如何解决?我找到了this,你觉得这有关系吗?
答案 0 :(得分:0)
这是摘自RecyclerView documentation
<块引用>顾名思义,RecyclerView 回收这些单独的元素。 当一个项目滚出屏幕时,RecyclerView 不会销毁它 看法。相反, RecyclerView 为具有 在屏幕上滚动。这种重用极大地提高了性能,改进了 您的应用的响应能力并降低功耗。
这意味着当视图被重用时,它将保留当前属性。您可以在调用 onBindViewHolder
时更改它们。
在您的特定情况下
@Override
public void onBindViewHolder(@NonNull AdapterObject.ViewHolder holder, int position) {
Object o = objectList.get(position);
Log.d("TAG", o.getAtribute());
if (o.getAtribute().equals("A")){
holder.atribute.setVisibility(View.VISIBLE);
} else. {
holder.atribute.setVisibility(View.GONE);
}
}