0
私は同様のボタンを持つ行としてcardviewを持っています。そのボタンのイベントを処理するアダプタ内にリスナーを設定しました。問題は、行の好きなボタンをクリックすると、他の行(すべてではない)がクリックなどを受け取るということです。たとえば、行番号1のlikeボタンをクリックすると、行番号7もボタンをクリックしたように表示されます。リスナー内部のリスナーアダプタは他の行に影響を与えます
public class InmuebleAdapter extends RecyclerView.Adapter<InmuebleAdapter.MyViewHolder> {
private List<Inmueble> inmueblesList;
private Context mContext;
static final int MIN_DISTANCE = 20;
private float x1, x2;
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView precio, habitaciones, metros, baños, garajes, avenida, estado;
public ImageView image, fav;
public LinearLayout info;
public MyViewHolder(View view) {
super(view);
precio = (TextView) view.findViewById(R.id.precio);
habitaciones = (TextView) view.findViewById(R.id.habitaciones);
metros = (TextView) view.findViewById(R.id.metros);
baños = (TextView) view.findViewById(R.id.baños);
garajes = (TextView) view.findViewById(R.id.garajes);
avenida = (TextView) view.findViewById(R.id.avenida);
estado = (TextView) view.findViewById(R.id.estado);
image = (ImageView) view.findViewById(R.id.image);
fav = (ImageView) view.findViewById(R.id.fav);
info = (LinearLayout) view.findViewById(R.id.info);
}
}
public InmuebleAdapter(List<Inmueble> inmueblesList, Context context) {
this.inmueblesList = inmueblesList;
this.mContext = context;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.inmueble_row_item4, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
Inmueble inmueble = inmueblesList.get(position);
holder.precio.setText("Ref. " + inmueble.getPrecio());
holder.habitaciones.setText(inmueble.getHabitaciones() + " habitaciones");
holder.metros.setText(inmueble.getMetrosCuadrados() + "m²");
holder.baños.setText(inmueble.getBaños() + " baños");
holder.garajes.setText(inmueble.getGarajes() + " garajes");
holder.avenida.setText(inmueble.getDireccion());
holder.estado.setText(inmueble.getCiudad() + ", " + inmueble.getEstado());
Glide.with(mContext)
.load(inmueble.getImgUrl())
.centerCrop()
.into(holder.image);
holder.fav.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setFav(holder, position);
Toast.makeText(mContext, "Posicion: " + position, Toast.LENGTH_SHORT).show();
Toast.makeText(mContext, "Holder posicion: " + holder.getAdapterPosition(), Toast.LENGTH_SHORT).show();
}
});
holder.image.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
layoutHideAnimation(holder, event, position);
return true;
}
});
}
@Override
public int getItemCount() {
return inmueblesList.size();
}
public void layoutHideAnimation(MyViewHolder holder, MotionEvent event, int position) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
x1 = event.getX();
break;
case MotionEvent.ACTION_UP:
x2 = event.getX();
float deltaX = x2 - x1;
if (Math.abs(deltaX) > MIN_DISTANCE) {
Toast.makeText(mContext, "Swipe", Toast.LENGTH_SHORT).show();
}
else {
if (inmueblesList.get(position).getInfoIsHide()) {
holder.info.animate().translationY(0).alpha(1.0f);
inmueblesList.get(position).setInfoIsHide(false);
} else {
holder.info.animate().translationY(holder.info.getHeight()).alpha(1.0f);
inmueblesList.get(position).setInfoIsHide(true);
}
}
break;
}
}
public void setFav(MyViewHolder holder, int position) {
if (inmueblesList.get(position).getLiked()) {
Glide.with(mContext)
.load(R.drawable.ic_favorite_border_white_24dp)
.into(holder.fav);
inmueblesList.get(position).setLiked(false);
} else {
Glide.with(mContext)
.load(R.drawable.ic_favorite_white_24dp)
.into(holder.fav);
inmueblesList.get(position).setLiked(true);
}
}
}