I want to filter a list based on RealmRecyclerViewAdapter
and get granular animations (notifyItemRange*()
).
My filtering logic:
override fun observeCampaigns(nameQuery: String): Flowable<RealmResults<CampaignRealm>> =
Realm.getDefaultInstance().use { realm ->
realm.where<CampaignRealm>()
.contains(CampaignRealmFields.NAME, nameQuery, Case.INSENSITIVE)
.findAllAsync()
.asFlowable()
.filter { it.isLoaded }
}
The problem is that inside the adapter the changeSet state is always INITIAL, I assume because I create a new RealmResults object each time I change the query.
private OrderedRealmCollectionChangeListener createListener() {
return new OrderedRealmCollectionChangeListener() {
@Override
public void onChange(Object collection, OrderedCollectionChangeSet changeSet) {
if (changeSet.getState() == OrderedCollectionChangeSet.State.INITIAL) {
// IT ALWAYS HITS THIS
notifyDataSetChanged();
return;
}
// For deletions, the adapter has to be notified in reverse order.
OrderedCollectionChangeSet.Range[] deletions = changeSet.getDeletionRanges();
for (int i = deletions.length - 1; i >= 0; i--) {
OrderedCollectionChangeSet.Range range = deletions[i];
notifyItemRangeRemoved(range.startIndex, range.length);
}
OrderedCollectionChangeSet.Range[] insertions = changeSet.getInsertionRanges();
for (OrderedCollectionChangeSet.Range range : insertions) {
notifyItemRangeInserted(range.startIndex, range.length);
}
if (!updateOnModification) {
return;
}
OrderedCollectionChangeSet.Range[] modifications = changeSet.getChangeRanges();
for (OrderedCollectionChangeSet.Range range : modifications) {
notifyItemRangeChanged(range.startIndex, range.length);
}
}
};
}
I couldn't find a solution anywhere. I can't be the first person who has a simple use case like this... right?! (I'm going nuts here )
Ideas?
you can do something like this: its work for me to get updated result with filter and notify your adapter . and an other solution refer this code