我使用以下代码为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?
答案 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);
}