Как взаимодействовать с адаптером из Activity
Я пытаюсь скрыть itemView по нажатию кнопки. Если я это делаю из адаптера(клик по itemView), то всё работает как нужно. А если я пытаюсь скрывать из Activity, то не получается.
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mFirebaseAdapter.startSelection();
}
});
mFirebaseAdapter = new FirebaseRecyclerAdapter<TripModel, RecyclerView.ViewHolder>(options){
boolean showCheckboxes = true;
public void startSelection() {
showCheckboxes = false;
notifyDataSetChanged();
}
@Override
protected void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int position, @NonNull final TripModel model) {
if (viewHolder instanceof DriverViewHolder) {
((DriverViewHolder) viewHolder).comment.setText(model.getComment());
((DriverViewHolder) viewHolder).phone.setText(model.getPhone());
viewHolder.itemView.setVisibility(showCheckboxes ? View.VISIBLE: View.GONE);
return;
Ответы (2 шт):
Для коммуникации между активностью и адаптером можно использовать встроенный метод адаптера:
adapter.notifyItemChanged (int position, Object payload)
и в адаптере нужно переопределить метод onBindViewHolder
@Override
public void onBindViewHolder(HelloViewHolder holder, int position, List<Object> payload) {
Log.d("butt", "payload " + payload.toString());
}
и дальше при поступлении данных в адаптер вы можете скрывать item:
holder.itemView.visibility = View.GONE;
Второй вариант - использовать интерфейс который будет передавать данные из активности в адаптер.
Адаптер ничего не должен решать сам. Он не должен сам скрывать никаких View. Все что он должен уметь это отрисовывать список который получает извне.
Каково должно быть взаимодействие в вашем кейсе?
Вы можете создать модель в которой будут поля которые вам необходимы для отображения в адаптере. Например
class Model {
String comment;
String phone;
boolean visibilty;
// другие поля по необходимости
}
Адаптер должен принимать на вход список этих самых моделей и просто отображать то что вам необходимо исходя из полей которые вы задали извне.
Для этого вы в адаптере можете создать метод в адаптере вроде такого
public void updateAdapter(List<Model> models) {
this.models = models;
notifyDataSetChanged();
}
И каждый раз когда вам надо его скрыть вы просто из вашей активити вызываете метод updateAdapter() и обновляете свой список.
Взаимодействие адаптера и активити должно быть только через интерфейс. Более подробно можете посмотреть здесь.
Если вы не хотите всякий раз обновлять весь список в адаптере то стоит использовать DiffUtils, он будет обновлять только те элементы которые изменились.