代码之家  ›  专栏  ›  技术社区  ›  user9822291

回收者视图未获取照片的位置

  •  -1
  • user9822291  · 技术社区  · 6 年前

    我是android开发新手。。。我有一个带视图的回收器2个取景器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) {
            }
        });
    
    
    }
    

    }

    3 回复  |  直到 6 年前
        1
  •  0
  •   lllllllllllllll    6 年前

    它不是在更新位置 **添加另一个变量(int position)用getItem(position)替换图片,只需添加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);
    
    });
    
    }
    
        2
  •  0
  •   prsandroid    6 年前

    Recyclerview重用其行。这很正常。您没有设置是否选中了like按钮。您正在选择一个,而视图保持器将其保持选中状态。可以将布尔变量添加到ObjectIncome对象中,并保持项目的选择状态。

        3
  •  0
  •   Parth Suthar    6 年前

    使用位置而不是支架。onbindviewhodler中的getAdapterPosition(),它位于onbindviewholder方法的参数中。