In a simple app project at GitHub ho solo 2 personalizzati Java-files:Come chiamare un metodo MainActivity da ViewHolder in RecyclerView.Adapter?
- MainActivity.java contiene Bluetooth e il codice sorgente UI legati
- DeviceListAdapter.java contiene un
Adapter
eViewHolder
per la visualizzazione di dispositivi Bluetooth in unRecyclerView
MainActivity.java contiene un metodo da chiamare, quando l'utente tocca su un dispositivo Bluetooth nella 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();
}
E nella classe ViewHolder
(nel DeviceListAdapter.java) il clic listener è definita:
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();
}
}
mio problema:
Come chiamare confirmConnection(address)
metodo dal ViewHolder
s metodo onClick
?
Continuo a spostare la dichiarazione di classe ViewHolder
tra i 2 file Java e ho anche provato a inserirla nel proprio file - e proprio non riesco a trovare la strada giusta.
Devo forse aggiungere un campo alla classe ViewHolder
e (quando?) Memorizzare un riferimento all'istanza MainActivity
lì?
UPDATE:
Questo funziona per me, ma sembra essere una soluzione alternativa (e anche io pensavo di usare LocalBroadcastReceiver
- che sarebbe un soluzione ancora più hackish) -
@Override
public void onClick(View v) {
String address = deviceAddress.getText().toString();
try {
((MainActivity) v.getContext()).confirmConnection(address);
} catch (Exception e) {
// ignore
}
}
tuo ViewHolder contiene una visualizzazione. Questa vista ha un contesto. Questo Context è molto probabilmente la tua attività. Quindi lancia il contesto a MainActivity e dovresti stare bene. L'utilizzo delle interfacce è l'approccio migliore. ((MainActivity) v.getContext()). ConfirmConnection() dovrebbe esserlo. – ElDuderino