【发布时间】:2018-04-05 14:49:30
【问题描述】:
我正在尝试将 onBindViewHolder 中的字符串 (userID) 传递给我的 ViewHolder 类。这背后的原因是我需要位置来分配正确的postID。此 postID 在 ViewHolder 中用作设置 Firebase valueEventListener 的参考。但是,在运行应用程序时,我在 postID 上得到一个 NullPointerException。这是因为同步吗? valueEventListener 是在设置 postID 之前调用的吗?
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
final PostViewHolder holder1 = (PostViewHolder) holder;
holder1.postID = getPostId(position)
//...
}
//...
public class PostViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
private DatabaseReference mNoOfLikesRef;
public String postID;
//...
public PostViewHolder(View itemView, postClickListener listener){
super(itemView);
//This line causes the NullPointerException on postID
mNoOfLikesRef = FirebaseDatabase.getInstance().getReference().child("likes").child(postID);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//...
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
mNoOfLikesRef.addListenerForSingleValueEvent(valueEventListener);
}
【问题讨论】:
-
发布你的get postId(position)源代码
-
感谢您的 cmets。 @ADM,是的,每个项目的 postID 都不同。我没有在
onBindViewHolder中设置它的原因是我试图阻止在每个视图绑定上调用 Firebase 数据库。我知道它需要设置在onCreateViewHolder,但这又取决于我在那个阶段没有的位置。 -
每个列表项的监听器对我来说似乎很忙。它有什么需要?如果您有 100 个列表项,那么将有 100 个侦听器。恕我直言,您应该在 root 上注册一个侦听器并使用 DiffUtil 通知对适配器的更改。如果这满足您的需要!如果没有,那么您必须在滚动期间回收行视图时管理侦听器。
-
@ADM,我实际拥有的是以下内容:我使用 Firestore 保存消息、时间戳等,并将这些作为列表传递给适配器。这些帖子中的每一个都可以被喜欢或不喜欢,我在 Firebase RTDB 上有一个喜欢/不喜欢的计数器(许多操作和使用事务)。任何帖子上的每个喜欢/不喜欢都会触发在根目录下使用 DiffUtil :(.
-
好的。如果添加了新帖子怎么办?如何向适配器添加新帖子?还是同根目录下没有新帖子了?
标签: android firebase android-recyclerview