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 alle Antworten durchgesehen und war nicht ganz zufrieden. Ich habe eine viel einfachere und schnellere Lösung gefunden. Wollte sie für zukünftige Leser teilen.
- Wählen Sie eine beliebige
View
innerhalb Ihres einzelnen Recycler-Elements aus. - Holen Sie sich das Elternelement dieser
View
(Stellen Sie sicher, dass Sie es in das entsprechendeViewGroup
umwandeln) - Weisen Sie Ihrem Elternelement den
onClickListener
zu.
Beispielcode (Es wird innerhalb Ihrer onBindViewHolder
-Methode Ihres Adapters
geschrieben):
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
ConstraintLayout parent = (ConstraintLayout) holder.title.getParent();
parent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "Recycler-Element an Position " + position + " geklickt", Toast.LENGTH_SHORT).show();
}
});
}
Hier ist mein Code-Schnipsel:
v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int newPosition = MainActivity.mRecyclerView.getChildAdapterPosition(v);
Intent cardViewIntent = new Intent(c, MainActivityCards.class);
cardViewIntent.putExtra("Position", newPosition);
c.startActivity(cardViewIntent);
}
});
v
ist View ausonCreateViewHolder
c
ist Context
Versuche das mal, einfach genug. Es funktioniert für mich. Übrigens habe ich festgestellt, dass setOnClickListener
keine Auswirkungen auf RecyclerView
hat.
recycler.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
// alles zu tun
}
return true;
}
});
Mal sehen, wie wir das auch mit Jetpack / AndroidX implementieren können
Sie müssen ein beobachtbares Objekt in der viewmodel-Klasse erstellen, wie folgt
private MutableLiveData adapterItem = new MutableLiveData<>();
public MutableLiveData getAdapterItem() {
return adapterItem;
}
public void setAdapterItem(int adapterItem) {
this.getAdapterItem().setValue(adapterItem);
}
Dann im adapter-Klasse stellen Sie sicher, dass Sie die viewmodel-Referenz als Parameter im Konstruktor übergeben und implementieren Sie dann den ClickListener auf dem viewholder
public MyViewHolder(@NonNull View itemView) {
super(itemView);
if(itemView != null){
itemView.setOnClickListener(v -> {
int adapterPosition = getAdapterPosition();
viewModel.setAdapterItem(adapterPosition);
});
};
}
Dann in der activity-Klasse beobachten Sie einfach die Änderungen
viewModel.getAdapterItem().observe(this, position -> {
Log.w(TAG, "geklickt: " + ridesArray.get(position));
});
Hier mein Weg
in Aktivitätsklasse:
public class MeineAktivität erweitert AppCompatActivity implementiert EmployeeAdapter.ClickListener {
...
@Override
public void onClick(int position) { ... }
...
}
in Adapterklasse:
public class MeinAdapter erweitert RecyclerView.Adapter {
...
@Override
public void onBindViewHolder(){
holder.textView1.setOnClickListener(v -> clickListener.onClick(position));
}
...
public Schnittstelle ClickListener {
void onClick(int position);
}
...
}