2017-02-17 9 views
0

У меня есть карта в виде строки с подобной кнопкой, я устанавливаю слушатель внутри адаптера, который обрабатывает события в этой кнопке. Проблема в том, что когда я нажимаю подобную кнопку строки, другие строки (не все) также получают щелчок или что-то в этом роде. Например, если я нажимаю кнопку типа строки номер 1, номер строки 7 также отображается так, как будто я нажал кнопку.Адаптер recyclerview со слушателем внутри влияет на другие строки

Это мой адаптер:

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

} 
} 

ответ

0

добавить несколько строк в код

  1. holder.setIsRecyclable(false); на onBindViewHolder
  2. необходимо проверить, является ли ваш держатель ListItem уже установлен или не подобное этому, когда вы нажимаете на Fav inmueblesList.get(position).setLiked(true); читайте статус понравившихся изображений, как будто вы читаете текст и устанавливаете их в текстовое поле.