Как во ViewHolder в RecyclerView привязать switchButton к объекту из room БД и кнопку со ссылкой на аудио данного объекта
Коллеги, подскажите пожалуйста новичку как прописать в RecyclerViewAdapter такую связь.
У меня объект Word - это шведское слово, его русский перевод, ссылка на аудио (типа R.raw.s1), и знаение int status (определяет в каком разделе слово появляется, в данном случае оно 200 либо 300).
Вопрос такой:
как прописать чтобы кнопка imageViewSound (в itemLayout-e) отсылала к аудиофайлу данного слова;
как прописать чтобы switch-кнопка switchStatus меняла в БД room статус слова с 200 на 300 (200 при true, 300 при false)?
@Override public void onBindViewHolder(@NonNull WordHolder holder, int position) { Word currentWord = words.get(position); holder.textViewSwedish.setText(currentWord.getSwedish()); holder.textViewRussian.setText(currentWord.getRussian()); holder.imageViewSound.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //????????????????????? } }); holder.switchStatus.set//??????????; }
Объект так выглядит:
@Entity(tableName = "word_table")
public class Word {
@PrimaryKey(autoGenerate = true)
private int id;
private String russian;
private String swedish;
private String sound;
private int status;
public Word(String russian, String swedish, String sound, int status) {
this.russian = russian;
this.swedish = swedish;
this.sound = sound;
this.status = status;
}
(там дальше геттеры и сеттеры)
Ответы (1 шт):
Ну во-первых сам адаптер уметь работать с БД не должен. Он может, но это плохая практика. Адаптер находится внутри какой-то View (Activity, Fragment и т.п.). При клике на тоггл вы должны сообщить вашей View, о том что пользователь кликнул на тоггл определенного айтема. А уже сама View решит как с этим жить дальше.
Для этого вам нужно создать интерфейс подобно этому:
interface OnToggleChangeListener {
void onToggleChange(currentWord: String, isChecked: Boolean);
}
В адаптере:
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {
private List<String> words;
private OnToggleChangeListener toggleListener;
MyRecyclerViewAdapter(List<String> items, OnToggleChangeListener clickListener) {
this.words = words;
this.toggleListener = toggleListener;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.itemView.setOnCheckedChangeListener { view, isChecked -> toggleListener.onToggleChange (words.get(position), isChecked)}
}
// другие методы адаптера
}
В активити/фрагменте:
class SomeActivity extends AppCompatActivity implements OnToggleChangeListener {
// другие методы активити
@Override
void onToggleChange(currentWord: String, isChecked: Boolean) {
// и вот тут вы делаете все что вам нужно с БД. Лучше конечно если у вас
// этим будет заниматсья не активити, а Presenter или View модель или похожая сушность.
// Но в целом если вы не работали с архитектурными паттернами, то можете просто здесь работать с БД
}
}