Во-первых, не имеет смысла называть notifyItemRemoved
и notifyDataSetChanged
. Они достигают схожих целей, поэтому вам захочется позвонить одному или другому. notifyDataSetChanged
сообщает адаптеру, что каждый вид должен быть восстановлен, и компоновка будет происходить так, как если бы вы только что подключили адаптер к RecyclerView
. notifyItemRemoved
уведомляет адаптер, что элемент по определенному индексу был удален. Это позволяет адаптеру выполнять соответствующие анимации для анимации удаления. Если у вас есть доступ к базовому списку Hotels_Model
, вы должны удалить все "unlive"
модели из коллекции. Затем вы можете позвонить notifyItemRemoved
с соответствующей позиции (ей). Если имеется много удалений, вы можете использовать notifyItemRangeRemoved
или DiffUtil
, чтобы рассчитать все необходимые удаления и передать их в адаптер.
Вот пример адаптера, который использует DiffUtil для отправки обновлений на адаптер:
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.RecyclerView;
class Adapter extends RecyclerView.Adapter<ViewHolder> {
public void updatePaths(List<String> oldPaths, List<String> newPaths) {
DiffResult diffResult = DiffUtil.calculateDiff(new DiffCallback(oldPaths, newPaths));
diffResult.dispatchUpdatesTo(this);
}
class DiffCallback extends DiffUtil.Callback {
private List<String> oldPaths;
private List<String> newPaths;
DiffCallback(List<String> oldPaths, List<String> newPaths) {
this.oldPaths = oldPaths;
this.newPaths = newPaths;
}
@Override public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return oldPaths.get(oldItemPosition).equals(newPaths.get(newItemPosition);
}
@Override public int getOldListSize() {return oldPaths.size;}
@Override public int getNewListSize() {return newPaths.size;}
@Override public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return oldPaths.get(oldItemPosition).equals(newPaths.get(newItemPosition));
}
}
}
Если для вычисления разницы требуется много времени (т. Е. Список очень большой), вам нужно вычислить разность в фоновом потоке и отправить результат обратно в основной поток.
Примечание по стилю. Я бы рекомендовал отказаться от подчеркивания в именах классов и использовать только CamelCase. Подчеркивание в именах классов идет вразрез с соглашением.