Tengo un objeto personalizado :

Student.class

public class Student {
  private String name;
  private String age;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getAge() {
    return age;
  }

  public void setAge(String age) {
    this.age = age;
  }
}

Luego me implementar RecyclerView.Adapter como este :

MyAdapter.class

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private Context context;
private ArrayList<Student> students = new ArrayList<>();
public MyAdapter(Context mContext, ArrayList<Student> mStudents) {
this.context = mContext;
this.students = mStudents;
}
@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(context).inflate(R.layout.item_row, parent, false);
return new ViewHolder(v);
}
@Override public void onBindViewHolder(ViewHolder holder, int position) {
final Student student = students.get(position);
holder.name.setText(student.getName());
holder.age.setText(student.getAge());
holder.setClickListener(new ItemClickListener() {
@Override public void onClickItem(int pos) {
Toast.makeText(context, "CLICK : " + student.getName(), Toast.LENGTH_SHORT).show();
}
@Override public void onLongClickItem(int pos) {
Toast.makeText(context, "LONG CLICK : " + student.getName(), Toast.LENGTH_SHORT).show();
}
});
}
@Override public int getItemCount() {
return students.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener, View.OnLongClickListener {
private TextView name;
private TextView age;
private ItemClickListener mListener;
public ViewHolder(View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.tv_name);
age = (TextView) itemView.findViewById(R.id.tv_age);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
}
public void setClickListener(ItemClickListener listener) {
this.mListener = listener;
}
@Override public void onClick(View view) {
mListener.onClickItem(getLayoutPosition());
}
@Override public boolean onLongClick(View view) {
mListener.onLongClickItem(getLayoutPosition());
return true;
}
}
public interface ItemClickListener {
void onClickItem(int pos);
void onLongClickItem(int pos);
}
}

Como se puede ver en onBindViewHolder(), me puse onItemClickListener() para titular.

@Override public void onBindViewHolder(ViewHolder holder, int position) {
final Student student = students.get(position);
holder.name.setText(student.getName());
holder.age.setText(student.getAge());
holder.setClickListener(new ItemClickListener() {
@Override public void onClickItem(int pos) {
Toast.makeText(context, "CLICK : " + student.getName(), Toast.LENGTH_SHORT).show();
}
@Override public void onLongClickItem(int pos) {
Toast.makeText(context, "LONG CLICK : " + student.getName(), Toast.LENGTH_SHORT).show();
}
});
}

Pero sé onBindViewHolder() método será llamado cada vez que un nuevo elemento se desplaza a la vista. Así que llame haga clic en oyente dentro de onBindViewHolder() causas caro operaciones dentro de ella.

¿Cómo puedo resolver este problema?

  • Usted puede establecer un clic de escucha en la que el titular del objeto en sí. La puso sobre uno de los que se incluyen visualización de los elementos.
  • para hacer que el interior de onCreateViewHolder en lugar de onBindViewHolder

5 Comentarios

  1. 8

    Que usted necesita para poner en onClickListener() en el punto de vista de la ViewHolder es decir, itemView en su caso. Se hará un llamado a la onClick() método tan pronto como usted haga clic en la vista completa, es decir, la raíz de vista (itemView en su caso)

    también puede establecer onClickListener() en los hijos de la raíz, es decir, el nombre y la edad.

    dentro de ViewHolder(Ver itemView) constructor:

    itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Toast.makeText(mContext,"clicked="+ getPosition(),Toast.LENGTH_SHORT).show();         
    }
    });

    Del mismo modo, usted puede llamar a onLongClickListner() también.
    Y name.setOnClickLisner() en niño demasiado.

    • se preguntan por qué no hay onitemclick lister para esto. @Baqir, su respuesta trabajado.
    • Por favor, también divulgar la getPosition() método de aplicación. cómo va a tener la posición dentro de ViewHolder constructor
    • cómo conseguir el adaptador de datos en esa posición?
    • getAdapterPosition() devuelve el elemento actual posición
  2. 2

    Puede implementar onClickListener para la vista principal como en la figura siguiente:

    //holder.view - parent layout inside recyclerView item
    holder.view.setTag(position);
    holder.view..setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    int pos = (int) v.getTag();
    Student student = students.get(pos);
    //Do your operation
    }
    });

    O

    si desea establecer onItemClickListener de activity/fragment donde recyclerView es inicializado, usted puede seguir este enlace: http://www.littlerobots.nl/blog/Handle-Android-RecyclerView-Clicks/

  3. 1

    Puede establecer evento Onclick para audiencias específicas:

    Por ejemplo:

     holder.layout.setClickListener(new ItemClickListener() {
    @Override public void onClickItem(int pos) {
    Toast.makeText(context, "CLICK : " + student.getName(), Toast.LENGTH_SHORT).show();
    }
  4. 1

    Forma más sencilla es la celebración de una sola ItemClickListener el interior del Adaptador:

    public class WalletListRecyclerAdapter extends RecyclerView.Adapter<WalletListRecyclerAdapter.ViewHolder> {
    private List<Wallet> wallets;
    private ItemClickListener itemClickListener;
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    Wallet wallet = wallets.get(position);
    holder.root.setOnClickListener(v -> {
    if (itemClickListener != null)
    itemClickListener.onClick(holder.root, wallet);
    });
    }
    static class ViewHolder extends RecyclerView.ViewHolder {
    View root;
    public ViewHolder(View v) {
    super(v);
    root = v;
    }
    }
    public void setItemClickListener(ItemClickListener itemClickListener) {
    this.itemClickListener = itemClickListener;
    }
    public interface ItemClickListener {
    void onClick(View view, Wallet wallet);
    }
    }

    De La Actividad:

    walletsAdapter = new WalletListRecyclerAdapter();
    walletsAdapter.setItemClickListener((view, wallet) -> {
    Intent intent = new Intent(this, WalletActivity.class);
    intent.putExtra(Const.KEY_WALLET, wallet);
    startActivity(intent);
    });
  5. 0

    reemplazar este código,

            @Override public void onBindViewHolder (ViewHolder holder,int position){
    final Student student = students.get(position);
    holder.name.setText(student.getName());
    holder.age.setText(student.getAge());
    holder.v.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Toast.makeText(context, "CLICK : " + student.getName(), Toast.LENGTH_SHORT).show();
    }
    });
    holder.v.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
    Toast.makeText(context, "CLICK : " + student.getName(), Toast.LENGTH_SHORT).show();
    return false;
    }
    });
    }

Dejar respuesta

Please enter your comment!
Please enter your name here