回收者视图没有得到照片的位置

recycler view not getting position of photo

我是 android 开发的新手...我有 1 个回收器,视图 2 Viewholder 1) 用于视频 2) 用于照片 ..我正在为我的照片实现类似的功能或视频 ...问题是我不喜欢我喜欢的照片,否则它在下面的另一张照片上显示喜欢我检查了 firebase 但它显示了它正在添加的相同内容,就像在数据库中的另一张照片上添加的一样

当我不向下滚动时它工作得很好......我认为它没有更新照片的位置我该如何解决这个问题请帮忙

public class TestAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final int VIDEO_TYPE=0;
public static final int IMAGE_TYPE=1;
private Context mContext;
private List<Photo> moviesList;
private DatabaseReference mReference;
private int mLayoutResource;
private LayoutInflater mInflater;
private Photo photo;
private VideoHolder mVideoHolder;
private PhotoHolder mPhotoHolder;

class PhotoHolder extends RecyclerView.ViewHolder {
    private SquareImageView image;
    private LikeButton mHeart,Star;
    public PhotoHolder(View view){
        super(view);
        mHeart = (LikeButton) view.findViewById(R.id.main_heart);
    }
}


class VideoHolder extends RecyclerView.ViewHolder{
    public VideoHolder(View view) {
        super(view);

    }

public TestAdapter(List<Photo> moviesList) {
    this.moviesList = moviesList;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    //findViewById...
    mContext = parent.getContext();
    switch (viewType) {
        case VIDEO_TYPE:
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.video_type, parent, false);
            mContext = parent.getContext();
            return new VideoHolder(v);
        case IMAGE_TYPE:
            View i = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_list, parent, false);
            mContext = parent.getContext();
            return new PhotoHolder(i);

    }
    return null;
}
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) {
   // mHolder = holder;
    photo = moviesList.get(holder.getAdapterPosition());
    //  final VideoHolder viewHolder2 = (VideoHolder)holder;
    int viewType = getItemViewType(holder.getAdapterPosition());
    switch ( viewType ) {
        case IMAGE_TYPE:
            PhotoHolder photoview = (PhotoHolder) holder;
            mPhotoHolder = photoview;
            getCurrentUsername();
            final ImageLoader imageLoader =  ImageLoader.getInstance();
            imageLoader.displayImage(getItem(holder.getAdapterPosition()).getImage_path(),photoview.image);
            photoview.mHeart.setOnLikeListener(new OnLikeListener() {
                @Override
                public void liked(LikeButton likeButton) {
                    addNewPhotolike(mPhotoHolder);
                }
                @Override
                public void unLiked(LikeButton likeButton) {
                    removePhotolike(mPhotoHolder);
                }
            });
            photoview.Star.setOnLikeListener(new OnLikeListener() {
                @Override
                public void liked(LikeButton likeButton) {

                }
                @Override
                public void unLiked(LikeButton likeButton) {
                }
            });
            break;
        case VIDEO_TYPE:
            final VideoHolder viewHolder2 = (VideoHolder)holder;
            mVideoHolder = viewHolder2;            
            break;
    }


}
@Override
public int getItemCount() {
    return moviesList.size();
}
public Photo getItem(int position) {
    return moviesList.get(position);
}
@Override
public int getItemViewType ( int position ) {
    int viewType;
    if (moviesList.get(position).getType_post().contains("Photo")) {
        viewType = IMAGE_TYPE;
    } else{
        viewType = VIDEO_TYPE;
    }
    return viewType;
}

这是给照片点赞的方法,如有问题请指正

private void addNewPhotolike(final TestAdapter.PhotoHolder holder){
    Log.d(TAG, "addNewlike: adding new like ");
    String newLikeID = mReference.push().getKey();
    Likes likes = new Likes();
    likes.setUser_id(FirebaseAuth.getInstance().getCurrentUser().getUid());
    mReference.child(mContext.getString(R.string.dbname_photos))
            .child(photo.getPhoto_id())
            .child(mContext.getString(R.string.field_likes))
            .child(newLikeID)
            .setValue(likes);
    mReference.child(mContext.getString(R.string.dbname_user_photos))
            .child(photo.getPhoto_id())
            .child(mContext.getString(R.string.field_likes))
            .child(newLikeID)
            .setValue(likes);
    holder.mHeart.setLiked(true);

    });

}

private void removePhotolike(final TestAdapter.PhotoHolder holder){
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
    reference.keepSynced(true);
    Query query = reference
            .child(mContext.getString(R.string.dbname_photos))
            .child(photo.getPhoto_id())
            .child(mContext.getString(R.string.field_likes));
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot singlesnapshot : dataSnapshot.getChildren()) {
                String keyID = singlesnapshot.getKey();
                if (holder.likeByCurrentUSer&& singlesnapshot.getValue(Likes.class).getUser_id().equals(FirebaseAuth.getInstance().getCurrentUser().getUid())) {
                    mReference.child(mContext.getString(R.string.dbname_user_photos))
                            .child(photo.getUser_id())
                            .child(photo.getPhoto_id())
                            .child(mContext.getString(R.string.field_likes))
                            .child(keyID)
                            .removeValue();
                    mReference.child(mContext.getString(R.string.dbname_photos))
                            .child(photo.getPhoto_id())
                            .child(mContext.getString(R.string.field_likes))
                            .child(keyID)
                            .removeValue();



                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });


}

}

Recyclerview 重复使用它的行。这是正常的。您没有设置您喜欢的按钮是否被选中。您正在选择一个并且 View holder 保持选中状态。您可以将一个布尔变量添加到您的 ObjectIncome 对象中并保持您的项目的选择状态。

在 onbindviewhodler 中使用 position 而不是 holder.getAdapterPosition(),它在 onbindviewholder 方法的参数中。

它没有更新位置 **在喜欢的侦听器中添加另一个变量(int position)用 getItem(position) 替换 photo 只需添加 addNewPhotolike(ViewHolder,position) **

private void addNewPhotolike(final TestAdapter.PhotoHolder holder, int position){
Log.d(TAG, "addNewlike: adding new like ");
String newLikeID = mReference.push().getKey();
Likes likes = new Likes();
likes.setUser_id(FirebaseAuth.getInstance().getCurrentUser().getUid());
mReference.child(mContext.getString(R.string.dbname_photos))
        .child(getItem(position).getPhoto_id())
        .child(mContext.getString(R.string.field_likes))
        .child(newLikeID)
        .setValue(likes);
mReference.child(mContext.getString(R.string.dbname_user_photos))
        .child(getItem(position).getPhoto_id())
        .child(mContext.getString(R.string.field_likes))
        .child(newLikeID)
        .setValue(likes);
holder.mHeart.setLiked(true);

});

}