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 vonViewHolder
s 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
}
}