【问题标题】:Passing variable(position) from onBindViewHolder to ViewHolder class将变量(位置)从 onBindViewHolder 传递给 ViewHolder 类
【发布时间】: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


【解决方案1】:

是的,您在PostViewHolder 的构造函数中调用它,该构造函数由onCreateViewHolder 方法在onBindViewHolder 之前调用。

【讨论】:

    【解决方案2】:

    ViewHolder 类中创建一个方法并从onBindViewHolder 调用它

    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final PostViewHolder holder1 = (PostViewHolder) holder;
        holder1.doYourTask(getPostId(position));
    
        //...
    }
    
    public class PostViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    
    //...
    
    public void doYourTask(String postID){
        DatabaseReference 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);
    }
    

    }

    【讨论】:

    • 这就是我想说的。我试着先写它,但 Shalauddin Ahamad Shuza 更快。如果你得到一个NullPointerException 不是因为你传错了,这意味着getPostId(position) 没有返回正确的值。
    • 当使用这种方法时,每次绑定新视图时都会触发SingleValueEventListener,对吗?我想通过在 ViewHolder 本身中调用它来防止这种情况发生。有什么办法吗?
    猜你喜欢
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2013-05-05
    • 2013-06-25
    • 1970-01-01
    相关资源
    最近更新 更多