Donc, après 5 mois de développement web, je devais revenir à Android, mais j’ai remarqué que certains de mes anciens codes ne fonctionnaient plus. J'ai un RecyclerView avec un adaptateur pour les données, mais le onClickListener pour les éléments ne répond à rien. Voici à quoi ressemble mon code:
public class ProjectAdapter extends RecyclerView.Adapter<ProjectAdapter.ViewHolder> {
private List<Project> itemsData;
OnItemClickListener mItemClickListener;
public ProjectAdapter(List<Project> itemsData) {
this.itemsData = itemsData;
}
// Create new views (invoked by the layout manager)
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new views
View itemLayoutView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_layout, parent, false);
// create ViewHolder
ViewHolder vh = new ViewHolder(itemLayoutView);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
viewHolder.txtViewId.setText(String.valueOf(itemsData.get(position).getId()));
viewHolder.txtViewName.setText(itemsData.get(position).getName());
}
// inner class to hold a reference to each item of RecyclerView
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public TextView txtViewName, txtViewId;
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
txtViewName = (TextView) itemLayoutView.findViewById(R.id.item_name);
txtViewId = (TextView) itemLayoutView.findViewById(R.id.item_id);
}
@Override
public void onClick(View v) {
System.out.println("onClick");
TextView tv = (TextView) v.findViewById(R.id.item_name);
String id = tv.getText().toString();
mItemClickListener.onItemClick(v, getAdapterPosition(), id); //OnItemClickListener mItemClickListener;
}
}
public interface OnItemClickListener {
public void onItemClick(View view, int position, String id);
}
public void SetOnItemClickListener(final OnItemClickListener mItemClickListener) {
this.mItemClickListener = mItemClickListener;
}
// Return the size of your itemsData (invoked by the layout manager)
@Override
public int getItemCount() {
return itemsData.size();
}
}
ProjetsActivité.Java
projectAdapter.SetOnItemClickListener(new ProjectAdapter.OnItemClickListener() {
@Override
public void onItemClick(View v, int position, String id) {
System.out.println("onItemClick" + id);
ActionActivity(id);
}
});
La liste est affichée, le clic ne fonctionne pas, pas même le journal de la console ... Est-ce que quelqu'un sait ce que j'ai fait de mal? J'utilise SDK v23 en tant que version compilée de sdk. Ma version minimale du SDK est v19.
ajoutez un clic après avoir trouvé une vue comme celle-ci:
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
txtViewName = (TextView) itemLayoutView.findViewById(R.id.item_name);
txtViewId = (TextView) itemLayoutView.findViewById(R.id.item_id);
// here
itemLayoutView.setOnClickListener(this);
}
Définissez le clic sur l'élément d'écoute sur la ligne de vue du recycleur:
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
itemLayoutView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
TextView tv = (TextView) v.findViewById(R.id.item_name);
String id = tv.getText().toString();
mItemClickListener.onItemClick(getLayoutPosition(), v, id);
}
});
txtViewName = (TextView) itemLayoutView.findViewById(R.id.item_name);
txtViewId = (TextView) itemLayoutView.findViewById(R.id.item_id);
}
Vous n'avez pas défini ClickListener
sur textView
ou Anything. Sur quelle View
est-ce que onClick
est appelé?
Étape 1: Changer de constructeur
public ProjectAdapter(List<Project> itemsData,OnItemClickListener itemClickListener) {
this.itemsData = itemsData;
onItemClickListener = itemClickListener;
}
Étape 2: référence à l'interface
public MyViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
}
Étape 3: Donnez à l’auditeur l’adaptateur de l’activité ou le fragment
MyAdapter myAdapter = new MyAdapter (list, this);