带有侦听器的recyclerview适配器会影响其他行

时间:2017-02-17 12:20:11

标签: android android-recyclerview adapter onclicklistener

我有一个带有类似按钮的行的cardview,我在适配器中设置了一个侦听器,用于处理该按钮中的事件。问题是,当我单击一行的like按钮时,其他行(不是全部)也会收到点击或类似的内容。例如,如果我单击行号1的“类似”按钮,则行号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);
    }

}
}

1 个答案:

答案 0 :(得分:0)

在代码中添加几行

  1. holder.setIsRecyclable(false); onBindViewHolder
  2. 必须检查您的持有人listItem是否已经过检查 点击收藏inmueblesList.get(position).setLiked(true);时与此相似 读取喜欢图像的状态,比如您阅读文本并将其设置为textview的。