Как вызвать метод MainActivity из ViewHolder в RecyclerView.Adapter?
Впростой проект приложения на GitHub У меня есть только 2 пользовательских Java-файла:
MainActivity.java содержит исходный код, связанный с Bluetooth и пользовательским интерфейсомDeviceListAdapter.java содержитAdapter
а такжеViewHolder
для отображения устройств Bluetooth вRecyclerView
MainActivity.java содержит метод для вызова, когда пользователь нажимает на устройство Bluetooth в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();
}
И вViewHolder
класс (вDeviceListAdapter.java) прослушиватель кликов определен:
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();
}
}
Моя проблема:
Как позвонитьconfirmConnection(address)
метод изViewHolder
s onClick
метод?
Я продолжаю двигатьсяViewHolder
объявление класса между двумя файлами Java, а также попытался поместить его в свой собственный файл - и просто не может найти правильный путь.
Должен ли я добавить поле вViewHolder
класс и (когда?) хранить ссылку наMainActivity
экземпляр там?
ОБНОВИТЬ:
Это работает для меня, но, кажется, это обходной путь (а также я думал об использованииLocalBroadcastReceiver
- что было бы еще более хакерским обходным путем) -
@Override
public void onClick(View v) {
String address = deviceAddress.getText().toString();
try {
((MainActivity) v.getContext()).confirmConnection(address);
} catch (Exception e) {
// ignore
}
}