Wie wird eine MainActivity-Methode aus ViewHolder in RecyclerView.Adapter aufgerufen?

Im ein einfaches App-Projekt bei GitHub Ich habe nur 2 benutzerdefinierte Java-Dateien:

MainActivity.java enthält Bluetooth- und UI-bezogenen Quellcode DeviceListAdapter.java enthält einAdapter undViewHolder zum Anzeigen von Bluetooth-Geräten in einemRecyclerView

Das MainActivity.java enthält eine Methode, die aufgerufen werden soll, wenn der Benutzer auf ein Bluetooth-Gerät im @ tippRecyclerView:

public void confirmConnection(String address) {
    final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Do you want to pair to " + device + "?");
    builder.setPositiveButton(R.string.button_ok, 
      new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            device.createBond();
        }
    });
    builder.setNegativeButton(R.string.button_cancel, null);
    builder.show();
}

Und in derViewHolder Klasse (im DeviceListAdapter.java) der Klicklistener ist definiert:

public class DeviceListAdapter extends
  RecyclerView.Adapter<DeviceListAdapter.ViewHolder> {

  private ArrayList<BluetoothDevice> mDevices = new ArrayList<BluetoothDevice>();

  protected static class ViewHolder
        extends RecyclerView.ViewHolder
        implements View.OnClickListener {

    private TextView deviceAddress;

    public ViewHolder(View v) {
        super(v);
        v.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        String address = deviceAddress.getText().toString();

        Toast.makeText(v.getContext(),
                "How to call MainActivity.confirmConnection(address)?",
                Toast.LENGTH_SHORT).show();
    }
  }

Mein Problem

Anrufen vonconfirmConnection(address) Methode vonViewHolders onClick Methode

Ich bleib in BewegungViewHolder class-Deklaration zwischen den beiden Java-Dateien und hat auch versucht, sie in eine eigene Datei zu packen - und kann einfach nicht den richtigen Weg finden.

Sollte ich vielleicht ein Feld zu @ hinzufügViewHolder class und (wann?) einen Verweis auf @ speicheMainActivity Instanz dort?

AKTUALISIEREN

Dies funktioniert für mich, scheint aber eine Problemumgehung zu sein (und ich habe auch darüber nachgedacht, @ zu verwendeLocalBroadcastReceiver - das wäre eine noch hackigere Umgehung) -

    @Override
    public void onClick(View v) {
        String address = deviceAddress.getText().toString();

        try {
            ((MainActivity) v.getContext()).confirmConnection(address);
        } catch (Exception e) {
            // ignore
        }
    }

Antworten auf die Frage(10)

Ihre Antwort auf die Frage