Hat jemand, der RecyclerView
verwendet, einen Weg gefunden, um einen onClickListener
für Elemente im RecyclerView
festzulegen? Ich dachte daran, für jedes Element einen Listener für jedes Layout festzulegen, aber das scheint etwas zu umständlich zu sein. Ich bin sicher, dass es eine Möglichkeit gibt, dass der RecyclerView
auf das onClick
-Ereignis hört, aber ich kann es nicht ganz herausfinden.
Antworten
Zu viele Anzeigen?Ich habe eine leichte Bibliothek für Android entwickelt, die du auf GitHub besuchen und diesem Beispiel folgen kannst:
RecycleClick.addTo(DEIN_RECYCLE_VIEW).setOnItemClickListener(new RecycleClick.OnItemClickListener() {
@Override
public void onItemClicked(RecyclerView recyclerView, int position, View v) {
// Dein Code hier
}
});
Sie können View.OnClickListener implementieren
zu Ihrer ViewHolder
Klasse.
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public Item item;
@InjectView(R.id.tv_title)
public TextView tvTitle;
@InjectView(R.id.rl_row)
public RelativeLayout rlRow;
public ViewHolder(View v) {
super(v);
ButterKnife.inject(this, v);
v.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Log.e("item title",item.getTitle());
}
}
Und onBindViewHolder
setzen Sie das Item Ihres ViewHolders:
public void onBindViewHolder(ViewHolder holder, int position) {
holder.tvTitle.setText(objects.get(position).getTitle());
holder.item = objects.get(position);
}
Sie können ganz einfach setOnClickListener
in Ihrer ViewHolder
-Klasse wie folgt definieren:
public class ViewHolder extends RecyclerView.ViewHolder {
TextView product_name;
ViewHolder(View itemView) {
super(itemView);
product_name = (TextView) itemView.findViewById(R.id.product_name);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int itemPosition = getLayoutPosition();
Toast.makeText(getApplicationContext(), itemPosition + ":" + String.valueOf(product_name.getText()), Toast.LENGTH_SHORT).show();
}
});
}
}
Alle bisher geposteten Antworten sind großartige Lösungen. Wenn Sie jedoch nicht zu viele Implementierungsdetails behandeln möchten und einfach möchten, dass es ähnlich wie ListView funktioniert, empfehle ich die Verwendung von TwoWay-View, wie hier zu sehen:
https://github.com/lucasr/twoway-view
Beachten Sie, dass diese Implementierung auch die lange Druckfunktion auf Elemente unterstützt sowie Unterstützung für gedrückte Zustände bietet (was eine wichtige Sache ist, die anderen Lösungen zu dieser Frage fehlt).
Wenn Sie nicht die gesamte Bibliothek verwenden möchten, werfen Sie einen Blick auf die ClickItemTouchListener-Klasse, die bei Bedarf eigenständig verwendet werden kann. Das einzige Problem, das ich derzeit damit gefunden habe, ist mit langer Druck + Scrollen, es scheint ein falsches Verhalten zu haben.
Der RecyclerView
hat kein OnClickListener
und muss von uns selbst implementiert werden.
Ich füge eine OnItemClickListener
-Schnittstelle im Adapter
hinzu mit einer onClick
-Methode, die aufgerufen wird, wenn Sie auf die Elementansicht vom ViewHolder
klicken. So liegt die Verantwortung für das Klicken auf einem Element außerhalb des ViewHolder
und des Adapters
. Die Aktivität oder das Fragment entscheiden dann, was zu tun ist
Fügen Sie eine Schnittstelle zum Zuhörer und dem Zuhörerobjekt hinzu.
public class ItemsAdapter extends RecyclerView.Adapter {
...
private static OnItemClickListener onItemClickListener;
...
public static interface OnItemClickListener {
public void onItemClick(View view, int position);
}
...
}
Wir erfassen das Klicken auf die Root-Ansicht des Elements und wenn das Callback ausgelöst wird, rufen wir den onClick
-Listener im Adapter auf.
public class ItemsAdapter extends RecyclerView.Adapter {
...
private static OnItemClickListener onItemClickListener;
...
public static interface OnItemClickListener {
public void onItemClick(View view, int position);
}
...
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView imageView;
public ViewHolder(View itemRootView) {
super(itemRootView);
imageView = (ImageView) itemRootView.findViewById(R.id.itemImage);
itemRootView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = ViewHolder.super.getAdapterPosition();
onItemClickListener.onItemClick(view,position);
}
});
}
}
}
Da die Aktivität oder das Fragment, in unserem Fall das Fragment, weisen wir dem Adapter einen Zuhörer zu und wenn das onClick-Callback aufgerufen wird, erhalten wir das ausgewählte Element nach Position und öffnen eine detaillierte Aktivität des Elements.
public class ItemsFragment extends Fragment {
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
...
((ItemsAdapter) adapter).setOnItemClickListener(new ItemsAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
//Machen Sie etwas, wenn ein Element angeklickt wurde
}
});
...
}
...
}