【问题标题】:Firestore RecyclerView itemCount returns 0Firestore RecyclerView itemCount 返回 0
【发布时间】:2020-12-26 06:03:49
【问题描述】:

所以在我的应用中,我使用的是 Firestore Recyclerview,我想计算其中显示的项目。我试过使用 registerAdapterDataObserveronItemRangeInserted 并且它们似乎只有在至少有一个项目时才有效RecyclerView。如果没有,它甚至不会运行。

然后,我尝试实现 getItemCount() 方法,但它总是返回 0。

我有一个类是 FirestoreRecyclerView 的适配器。

private OnItemClickListener listener;

public JobsAdapter(@NonNull FirestoreRecyclerOptions<Job> options) {
    super(options);
}

@Override
protected void onBindViewHolder(@NonNull jobHolder holder, int position, @NonNull Job model) {
    holder.textViewTitle.setText(model.getJobName());
    holder.textViewDescription.setText(model.getJobDescription());
    holder.textViewPostDate.setText(model.getJobDate());
}

@Override
public int getItemCount() {
    Log.d("adaptercount", "getItemCount: " + super.getItemCount());
    return super.getItemCount();
}


@NonNull
@Override
public jobHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.job_item, parent, false);
    return new jobHolder(v);
}

class jobHolder extends RecyclerView.ViewHolder {
    TextView textViewTitle;
    TextView textViewDescription;
    TextView textViewPostDate;

    public jobHolder(View itemView) {
        super(itemView);
        textViewTitle = itemView.findViewById(R.id.text_view_title);
        textViewDescription = itemView.findViewById(R.id.text_view_desc);
        textViewPostDate = itemView.findViewById(R.id.text_view_post_date);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION && listener != null) {
                    listener.onItemClick(getSnapshots().getSnapshot(position), position);
                }
            }
        });
    }
}

这里的 getItemCount() 方法运行良好,但是当我尝试在另一个片段中调用此方法时,它返回 0。

片段中我的RecyclerViewInit()方法:

Query query = prevJobRef.whereEqualTo("jobIsClosed", false).whereEqualTo("jobSenderID", userID);

    FirestoreRecyclerOptions<Job> options = new FirestoreRecyclerOptions.Builder<Job>().
            setQuery(query, Job.class)
            .build();

    adapter = new JobsAdapter(options);
    RecyclerView recyclerView = view.findViewById(R.id.recycler_view_activeJobs);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setAdapter(adapter);

    adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        public void onItemRangeInserted(int positionStart, int itemCount) {
            Log.d("count", String.valueOf(adapter.getItemCount()));
       
        }
    });

    Log.d("count2", String.valueOf(adapter.getItemCount()));

  
}

我感觉这是一个业余错误,希望你们能帮助我!

【问题讨论】:

    标签: java android firebase android-recyclerview google-cloud-firestore


    【解决方案1】:

    我已经尝试使用 registerAdapterDataObserveronItemRangeInserted 并且它们似乎只有在至少有RecyclerView 中的一项。如果没有,它甚至不会运行。

    这是预期的行为,因为onItemRangeInserted() 方法在适配器中插入至少一项时触发。如果没有要插入的项目,onItemRangeInserted() 方法将永远不会触发。但是,有两种方法可以解决此问题。第一个是用与onItemRangeInserted() 相同的方式覆盖onChanged() 方法,因为即使没有项目也会触发它。您拥有的第二个选项是直接在适配器类中覆盖 onDataChanged() 方法,正如我在以下帖子中的回答中所解释的那样:

    Android, on finish loading data from firebase

    第二个选项是可能的,因为您使用的是 Firebase-UI 库。

    【讨论】:

    • 嘿,亚历克斯!感谢您的回答,但这些选项似乎都不起作用。每当我从 Fragment 调用 getItemCount() 时,它都会返回 0,但在我的 Adapter 类中可以完美运行。
    • 您不能简单地使用getItemCount() 方法,因为the data from Cloud Firestore is loaded asynchronously。如果您说它在您的适配器类中完美运行,那么您的问题没有解决吗?
    • 不完全是,因为我想根据项目计数的值显示/隐藏 TextView。这就是我不知道该怎么做。
    • 您可以简单地继续在适配器中使用该方法并为您的活动创建回调。基本上,界面中的方法将根据您的逻辑触发。例如,如果您的适配器类中的itemCount 为零,则执行一些逻辑,否则执行其他逻辑。
    • 使用 FirestoreRecyclerOptions 删除项目后如何获取 ItemCount?
    【解决方案2】:

    大多数时候我都遇到过这个错误(我在 StackOverflow 上看到的人要求这个错误)结果证明是查询错误。

    如果您在控制台和 logcat 上没有错误,但仍然得到 0 个结果,那么我猜您的查询肯定有错误。

    确保您的查询是正确的。检查字段“jobIsClosed”是否为布尔值,“jobSenderID”是否为字符串。还要检查您的“prevJobRef”参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多