user6517192
user6517192

Reputation:

Cardview position is always -1

Im using the following code to set onClickListener for cardview.

@Override
    public MyViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.album_card, parent, false);
        final CardView card = (CardView)itemView.findViewById(R.id.card_view);
        final MyViewHolder holder = new MyViewHolder(itemView);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            StateListAnimator stateListAnimator = AnimatorInflater
                    .loadStateListAnimator(mContext, R.anim.lift_on_touch);
            card.setStateListAnimator(stateListAnimator);
        }
        card.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final int position = holder.getAdapterPosition();
            Log.d("Position",""+position);
                if (position == 2) {
                    Intent intent = new Intent(mContext, ExperienceActivity.class);
                    mContext.startActivity(intent);
                }
            }
        });

        return new MyViewHolder(itemView);
    }

OnClickListener is working perfectly but why is that the position always returns -1?

Upvotes: 1

Views: 103

Answers (2)

Naveen Kumar M
Naveen Kumar M

Reputation: 7557

User Tag concept to get position.

@Override
        public MyViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
            View itemView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.album_card, parent, false);
            final CardView card = (CardView)itemView.findViewById(R.id.card_view);
            final MyViewHolder holder = new MyViewHolder(itemView);
            holder.setTag(YOUR_POSTION);

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                StateListAnimator stateListAnimator = AnimatorInflater
                        .loadStateListAnimator(mContext, R.anim.lift_on_touch);
                card.setStateListAnimator(stateListAnimator);
            }
            card.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    final int position = (int)holder.getTag();
                Log.d("Position",""+position);
                    if (position == 2) {
                        Intent intent = new Intent(mContext, ExperienceActivity.class);
                        mContext.startActivity(intent);
                    }
                }
            });

            return new MyViewHolder(itemView);
        }

Upvotes: 0

Pavneet_Singh
Pavneet_Singh

Reputation: 37404

what i see the problem is you returning a new view holder in your 'Oncreateviewholde' instead of the one you have already created.

    @Override
        public MyViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
            View itemView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.album_card, parent, false);
            final CardView card = (CardView)itemView.findViewById(R.id.card_view);
            final MyViewHolder holder = new MyViewHolder(itemView);
    //
    // your code

            card.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    final int position = holder.getAdapterPosition();
                }
            });

            return new MyViewHolder(itemView); // problem, remove it
            return holder; // use this
         }

other thing is it's a good practice if you set listeners and initialize views inside your holder constructor like this

public class ViewHolder extends RecyclerView.ViewHolder implements  View.OnClickListener {


    public TextView title;
    public ImageView image;

    public ViewHolder(View itemView) {
        super(itemView);
        title = (TextView) itemView.findViewById(R.id.title);
        image = (ImageView) itemView.findViewById(R.id.thumbnail);
        image.setOnClickListener(this);
    }
    @Override
    public void onClick(View view) {
        Log.d("pos",""+getAdapterPosition());
         removeAt(getAdapterPosition());    
    }
}
public void removeAt(int position) {
    list.remove(position);
    notifyDataSetChanged();
}

Upvotes: 2

Related Questions