【问题标题】:Bug with the recycle view and the viewholder adapater in AndroidAndroid 中的回收器视图和查看器适配器的错误
【发布时间】:2021-05-27 17:45:39
【问题描述】:

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

我正在使用 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,否则, Textview 保持隐藏状态。

当我调试它时一切似乎都是正确的,因为对象及其属性对应于数据库,但是当我在 Android 模拟器中部署应用程序并开始在 Recycleview 上上下移动时,持有者开始显示 Textviews 尽管控制台调试似乎正确...

这在 RecycleViews 中正常吗?我该如何解决?我找到了this,你觉得有关系吗?

【问题讨论】:

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


    【解决方案1】:

    这是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);
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多