Android Cardview位置始终为-1

Android Cardview位置始终为-1,android,android-cardview,Android,Android Cardview,我使用以下代码为cardview设置onClickListener @Override public MyViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.album_card, parent, fals

我使用以下代码为cardview设置onClickListener

@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工作得很好,但为什么位置总是返回-1?

我看到的问题是您在“Oncreateviewholde”中返回了一个新的视图持有者,而不是您已经创建的视图持有者

    @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
         }
另一件事是,如果像这样在holder构造函数中设置侦听器并初始化视图,这是一个很好的实践

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();
}

用户标签的概念,以获得位置

@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);
        }

正在调用的holder.getAdapterPosition()。但你们是在哪里设置的立场持有人?我不确定这一点。应该在哪里进行设置..能否请您澄清最终CardView卡=(CardView)itemView.findViewById(R.id.card\U视图);最终MyViewHolder=新的MyViewHolder(itemView);支架设置位置(您的位置);MyViewHolder没有名为setPositionOK的方法,那么您可以像这样设置标记-holder.setTag(您的位置);你的职位是什么?