【问题标题】:After clicking a button view is updating on both items of recyclerview单击按钮视图后,recyclerview 的两项都会更新
【发布时间】:2018-01-22 19:13:12
【问题描述】:

我有一个带有明信片的 RecyclerView。所以每张明信片上都有一个点赞按钮。当我点击一个赞按钮时。有时它可以正常工作并更新当前项目。但是当我点击喜欢按钮时滚动后,它会同时更新另一个项目。

它不会将该数据发送到服务器。但是,只有视图被更新。然后当我再次上下滚动时。数据恢复正常。

问题出在以下 onClick 方法中:-

FirebaseDatabase.getInstance().getReference().child("topics").child("likes").child(data.getId()).child(username).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.child("like").exists()){

                    holder.like.setImageResource(R.drawable.ic_favorite_red_500_36dp);
                    holder.like.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            FirebaseDatabase.getInstance().getReference().child("topics").child("likes").child(data.getId()).child(username).child("like").removeValue();

                        }
                    });

                }else if(dataSnapshot.child("dislike").exists()) {

                    holder.like.setImageResource(R.drawable.brokenheart);
                    holder.like.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            FirebaseDatabase.getInstance().getReference().child("topics").child("likes").child(data.getId()).child(username).child("dislike").removeValue();

                        }
                    });
                }else{
                    holder.like.setImageResource(R.drawable.ic_favorite_border_red_500_36dp);
                    holder.like.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            FirebaseDatabase.getInstance().getReference().child("topics").child("likes").child(data.getId()).child(username).child("dislike").removeValue();
                            FirebaseDatabase.getInstance().getReference().child("topics").child("likes").child(data.getId()).child(username).child("like").setValue(true);

                        }
                    });


                }


            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        holder.like.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                FirebaseDatabase.getInstance().getReference().child("topics").child("likes").child(data.getId()).child(username).child("like").removeValue();
                FirebaseDatabase.getInstance().getReference().child("topics").child("likes").child(data.getId()).child(username).child("dislike").setValue(true);

                return true;
            }
        });

完整的适配器类https://pastebin.com/UnFGahWT

【问题讨论】:

  • 问题可能出在适配器类中。
  • 我认为问题可能存在于您可能正在使用的 ViewHolder 或 Adapter 中。毕竟,这只是代码的一部分。
  • 这是适配器类。但是等一下,我会上传完整的课程
  • 请检查我是否添加了有问题的链接@TharakaDevinda
  • 添加了有问题的链接@Yupi

标签: android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

尝试以下方法:-

public ViewHolder(View itemView) 方法中设置您的点击监听器,并使您的 ViewHolder 类实现 View.OnClickListener。

在适配器中添加:

  public Topic getItem(int position) {
    return topics.get(position);
   }

在 ViewHolder 的 onClick 方法中添加:

 int position = getAdapterPosition();
 if (position == RecyclerView.NO_POSITION) return;
 item = getItem(position);

因此,您将获得您需要更改或对其执行某些操作的确切对象。

【讨论】:

  • 感谢您的编辑 - 无法正确查看答案
  • 我在 ViewHolder 类中实现了 OnClickListener 并添加了操作。但是我的 onclicklistenenet 函数没有被调用。这是新的适配器pastebin.com/jRA8mxCv
  • 出于调试目的,请尝试注释掉适配器中的所有 clicklisteners,并在您的代码中的第 177 行的 viewholder costructor 中添加一个 clicklisteners:pic.setOnClickListener(this);
  • 在查看器中添加 onClickListener 时遇到了同样的问题。我不认为这是 onClickListeners 的问题。因为他们只是将值添加到 firebase 数据库而不对视图做任何事情。因此,Firebase ValueEventListsener 可能有问题..
  • 我尝试在 onClickListeners 中使用布尔条件并将 valueeventlistener 更改为 singlevalueventlistener。然后它起作用了。所以这是firebase监听器的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多