回收者视图没有得到照片的位置
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);
});
}
我是 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);
});
}