Android 中的回收视图和 viewholder 适配器的错误

时间:2021-05-27 17:45:39

标签: java firebase android-recyclerview android-adapter android-viewholder

我的应用程序中出现了一个非常奇怪的错误。为了更清楚,我将创建一个带有减号的类似示例。

我正在使用 addListenerForSingleValueEventFirebase 实时数据库 读取对象。当我读取对象时,我将它们存储在一个数组中,我将其传递给 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,你觉得这有关系吗?

1 个答案:

答案 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);
    }
  }