i use the code below to populate a recycler view containing image views and it works perfectly
public class PopularImageAdapter extends RecyclerView.Adapter<PopularImageAdapter.PhotoViewHolder> {
private static final int PHOTO_ANIMATION_DELAY = 600;
private static final Interpolator INTERPOLATOR = new DecelerateInterpolator();
private List<FeedItem> feedItems;
private Context context;
private final int cellSize;
private int lastAnimatedItem = -1;
private boolean lockedAnimations = false;
private OnPhotoFeedItemClickListener onFeedItemClickListener;
public PopularImageAdapter(Context context, List<FeedItem> feedItems){
this.context = context;
this.feedItems = feedItems;
this.cellSize = Utils.getScreenWidth(context) / 3;
}
@NonNull
@Override
public PopularImageAdapter.PhotoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_photo, parent, false);
StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();
layoutParams.height = cellSize;
layoutParams.width = cellSize;
layoutParams.setFullSpan(false);
view.setLayoutParams(layoutParams);
PhotoViewHolder cellFeedViewHolder = new PhotoViewHolder(view);
setupClickableViews(view,cellFeedViewHolder);
return new PhotoViewHolder(view);
}
private void setupClickableViews(final View view,final PhotoViewHolder cellFeedViewHolder) {
cellFeedViewHolder.ivPhoto.setOnClickListener(v -> onFeedItemClickListener.onPhotoClick(view, cellFeedViewHolder.getAdapterPosition(),feedItems));
}
@Override
public void onBindViewHolder(@NonNull PopularImageAdapter.PhotoViewHolder holder,final int position) {
holder.bindView(feedItems.get(position));
FeedItem item = feedItems.get(position);
Picasso.with(context)
.load(item.getImge())
.resize(cellSize, cellSize)
.centerCrop()
.into(holder.ivPhoto, new Callback() {
@Override
public void onSuccess() {
animatePhoto(holder);
}
@Override
public void onError() {
}
});
if (lastAnimatedItem < position) lastAnimatedItem = position;
}
private void animatePhoto(PhotoViewHolder viewHolder) {
if (!lockedAnimations) {
if (lastAnimatedItem == viewHolder.getAdapterPosition()) {
setLockedAnimations(true);
}
long animationDelay = PHOTO_ANIMATION_DELAY + viewHolder.getAdapterPosition() * 30;
viewHolder.flRoot.setScaleY(0);
viewHolder.flRoot.setScaleX(0);
viewHolder.flRoot.animate()
.scaleY(1)
.scaleX(1)
.setDuration(200)
.setInterpolator(INTERPOLATOR)
.setStartDelay(animationDelay)
.start();
}
}
public void setLockedAnimations(boolean lockedAnimations) {
this.lockedAnimations = lockedAnimations;
}
@Override
public int getItemCount() {
return feedItems.size();
}
public void setOnFeedItemClickListener(OnPhotoFeedItemClickListener onFeedItemClickListener) {
this.onFeedItemClickListener = onFeedItemClickListener;
}
public interface OnPhotoFeedItemClickListener {
void onPhotoClick(View v,int position, List<FeedItem> feedItems);
}
public static class PhotoViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.flRoot)
FrameLayout flRoot;
@BindView(R.id.ivPhoto)
ImageView ivPhoto;
FeedItem feedItem;
PhotoViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
}
void bindView(FeedItem feedItem){
this.feedItem = feedItem;
}
}
}
but when i use
@Override
public void onPhotoClick(View v,int position, List<FeedItem> feedItems) {
FeedItem item = feedItems.get(position);
String name = item.getName();
Toast.makeText(getContext(),name + "Is the name ", Toast.LENGTH_LONG).show();
}
i get an error showing that my adapterposition is -1 and i am not sure where the -1 comes from because even when i remove the global variable initialized to -1 i still get -1 as the adapter position