Cardview的位置始终为-1

时间:2016-07-29 06:14:33

标签: 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, 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?

2 个答案:

答案 0 :(得分:3)

我发现问题是您在“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
         }

另一件事是,如果你设置监听器并在你的持有者构造函数中初始化视图,这是一个很好的做法

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

答案 1 :(得分:1)

用户标记概念获取位置。

@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);
        }
相关问题