вид переработчика не получает положение фотографии - PullRequest
0 голосов
/ 04 июня 2018

Я новичок в разработке для Android ... У меня есть 1 переработчик с видом 2 Viewholder 1) для видео 2) для фотографии .. Я реализовал функцию, подобную моей фотографии или видео ... проблема в том, что яНа фотографии мне это не нравится. Мне нравится, на другой фотографии, которая находится ниже. Я отмечаю в базе данных, но она показывает то же самое, что и на другой фотографии в базе данных

это работает отлично, когда я не прокручиваю вниз ... Я думаю, что это не обновляет положение фотографии, как я могу это исправить, пожалуйста, помогите

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 ]

0 голосов
/ 04 июня 2018

Использовать позицию вместо holder.getAdapterPosition (), в onbindviewhodler, который в параметре метода onbindviewholder.

0 голосов
/ 04 июня 2018

это не обновляет позицию ** добавьте еще одну переменную (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);

});

}
0 голосов
/ 04 июня 2018

Recyclerview повторно использует свои строки.Это нормально.Вы не устанавливаете свою кнопку «Нравится» или нет.Вы выбираете один, а Держатель просмотра сохраняет его выбранным.Вы можете добавить логическую переменную в свой объект ObjectIncome и сохранить статус выбора вашего элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...