2014-12-24 5 views
8

Vor der Einführung von RecyclerView (und seinem obligatorischen Muster ViewHolder) delegiere ich normalerweise alle Klickereignisse an die entsprechenden Activity/Fragment mit setOnItemClickListener(). (Weil ich hauptsächlich Activity/Fragment als „Controller“ Objekt sehen, wenn für Android zu entwickeln, so dass jede Änderung der Ansicht sollte es geschehen.)RecyclerView - Wo soll ich mit Klickereignissen verfahren?

Jetzt, da RecyclerView nicht wirklich behandeln ihre Kinder auf die gleiche Weise und dass setOnItemClickListener() (oder ähnliche) Methoden dafür nicht mehr implementiert sind - wo sollte ich Klickereignisse behandeln, die stattfinden können? Ich weiß es nicht .. aber die Handhabung in einem Adapter scheint mir peinlich.

Wie sollen wir es tun?

Vielen Dank im Voraus!

+0

machen Sie Ihre benutzerdefinierte ViewHolder implementieren OnClickListener – pskink

Antwort

4

Erstellen Sie Ihren eigenen viewHolder für die Recycler-Ansicht, wie wir es immer tun, und setzen Sie in der onBindView-Methode den Klick-Listener auf die Ansicht, in der Sie den Klick ausführen möchten.

@Override 
public void onBindViewHolder(final ViewHolder viewHolder, int position) { 
viewHolder.mRelContent.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // perform ur click here 
     } 
    }); 
} 
+0

Ich landete mit Ihrer Methode. Volodymyrs Antwort ist großartig für Listen, die keine langen Presseereignisse verarbeiten müssen, sonst müsste man einige Feinabstimmungen vornehmen, damit es funktioniert. Deines ist viel einfacher zu implementieren. Vielen Dank! – ridsatrio

+0

Dies ist eine einfache Lösung, aber wenn Sie diesen ViewHolder an anderer Stelle in Ihrem Code verwenden und verschiedene Click/Touch-Handler bereitstellen möchten, ist dieser Ansatz nicht geeignet. Sie müssen die Ereignisse außerhalb des Adapters (oder ViewHolder) behandeln. – plopd

+0

Ich denke, der beste Weg, um damit umzugehen ist innerhalb Aktivität oder Fragment –

3

See Jakobs implementation von RecyclerView.OnItemTouchListener. Ich denke, es ist die beste Lösung.

Ich hoffe, es wird Ihnen helfen. Grüße.

+0

Warum denkst du, diese Methode ist besser als die eine OP als Antwort akzeptiert? – veritas

+0

@veritas, weil in der akzeptierten Antwort müssen Sie jedes Mal klicken Listener setzen, wenn Sie Ansicht Halter binden, in diesem Fall setzen Sie Touch-Listener für RecyclerView an einem Ort und das ist es. Wie bei ListView. –