W a simple app project at GitHub mam tylko 2 niestandardowe java-pliki:Jak wywołać metodę MainActivity z ViewHolder w RecyclerView.Adapter?
- MainActivity.java i Bluetooth, zawiera kod źródłowy związanych z UI-
- DeviceListAdapter.java zawiera
Adapter
iViewHolder
do wyświetlania urządzeń Bluetooth wRecyclerView
The MainActivity.java zawiera metodę, która będzie wywoływana, gdy użytkownik kliknie na urządzeniu Bluetooth w 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();
}
A w klasie ViewHolder
(w DeviceListAdapter.java) click słuchacz jest zdefiniowana:
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();
}
}
My problem:
Jak wywołać confirmConnection(address)
metoda z ViewHolder
s onClick
metody?
Wciąż przenosimy ViewHolder
deklarację klasy między 2 plikami Java, a także próbowałem umieścić ją we własnym pliku - i po prostu nie można znaleźć właściwej drogi.
Czy powinienem dodać pole do klasy ViewHolder
i (kiedy?) Przechowywać odwołanie do instancji MainActivity
tam?
UPDATE:
Działa to dla mnie, ale wydaje się, że obejście (i też myślałem o użyciu LocalBroadcastReceiver
- co byłoby jeszcze bardziej hackish obejście) -
@Override
public void onClick(View v) {
String address = deviceAddress.getText().toString();
try {
((MainActivity) v.getContext()).confirmConnection(address);
} catch (Exception e) {
// ignore
}
}
Twój ViewHolder zawiera View. Ten widok ma kontekst. Ten kontekst to najprawdopodobniej Twoja aktywność. Przerzuć Kontekst do MainActivity i powinieneś być w porządku. Korzystanie z interfejsów jest jednak lepszym rozwiązaniem. ((MainActivity) v.getContext()). ConfirmConnection() powinno to być. – ElDuderino