1

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

mikayiri
  • 39
  • 7
  • 1
    Can you provide the stack trace of the error? Where does the error happens? inside the onPhotoClick? the stack trace might give more details on the code and how to analyze it better – Sander Rito Oct 01 '18 at 22:10
  • Possible duplicate of [getAdapterPosition() not returning position of item in RecyclerView](https://stackoverflow.com/questions/30947805/getadapterposition-not-returning-position-of-item-in-recyclerview) – Bruno Oct 02 '18 at 07:57

1 Answers1

0

In your onCreateViewHolder method you're returning new instance of PhotoViewHolder instead of cellFeedViewHolder in which you have defined your clicks.

arvind
  • 104
  • 4