677 Stimmen

RecyclerView onClick

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.

1voto

Azizjon Kholmatov Punkte 1066

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.

  1. Wählen Sie eine beliebige View innerhalb Ihres einzelnen Recycler-Elements aus.
  2. Holen Sie sich das Elternelement dieser View (Stellen Sie sicher, dass Sie es in das entsprechende ViewGroup umwandeln)
  3. 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();
        }
    });
}

1voto

zackygaurav Punkte 4149

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 aus onCreateViewHolder
  • c ist Context

0voto

ManuQiao Punkte 680

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;
    }
});

0voto

Roman Gherta Punkte 792

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));
    });

0voto

vitalinvent Punkte 345

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);
    }
    ...
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X