So rufen Sie eine MainActivity die Methode von ViewHolder in RecyclerView.Adapter?

In eine einfache app-Projekt auf GitHub ich habe nur 2 benutzerdefinierte Java-Dateien:

  1. MainActivity.java enthält Bluetooth - und UI-bezogene Quell-code
  2. DeviceListAdapter.java enthält eine Adapter und ViewHolder für die Anzeige von Bluetooth-Geräten in einem RecyclerView

So rufen Sie eine MainActivity die Methode von ViewHolder in RecyclerView.Adapter?

Den MainActivity.java enthält eine Methode aufgerufen werden, wenn der Benutzer tippt auf ein Bluetooth-Gerät in der RecyclerView:

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 der ViewHolder Klasse (in der DeviceListAdapter.java) der Klick-listener definiert ist:

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:

Wie nennen confirmConnection(address) Methode von ViewHolders onClick Methode?

Ich in Bewegung bleiben ViewHolder Klasse Erklärung zwischen 2 Java-Dateien und auch versucht, indem es in seine eigene Datei - und kann einfach nicht den richtigen Weg finden.

Sollte ich vielleicht hinzufügen eines Felds zu ViewHolder Klasse und (Wann?) speichern Sie einen Verweis auf MainActivity Instanz gibt?

UPDATE:

Dies funktioniert für mich, aber scheint ein workaround (und auch ich war denken mit LocalBroadcastReceiver - das wäre ein noch mehr hackish workaround) -

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

        try {
            ((MainActivity) v.getContext()).confirmConnection(address);
        } catch (Exception e) {
            //ignore
        }
    }
  • Ihre ViewHolder enthält eine Ansicht. Diese Ansicht hat einen Kontext. Dieser Zusammenhang ist den meisten vermutlich Ihre Aktivität. So warf der Kontext zu MainActivity und Sie sollten in Ordnung sein. Über Schnittstellen ist die bessere Vorgehensweise aber. ((MainActivity)v. getContext()).confirmConnection() sollte es sein.
Schreibe einen Kommentar