【问题标题】:Filter RealmResults with String query and get RecyclerView granular animations使用字符串查询过滤 RealmResults 并获取 RecyclerView 粒度动画
【发布时间】:2018-10-02 19:58:34
【问题描述】:

我想根据RealmRecyclerViewAdapter 过滤列表并获得精细动画 (notifyItemRange*())。

我的过滤逻辑:

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 }
    }

问题在于,在适配器内部,changeSet 状态始终为 INITIAL,我假设是因为每次更改查询时我都会创建一个新的 RealmResults 对象。

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);
            }
        }
    };
}

我在任何地方都找不到解决方案。我不可能是第一个拥有这样一个简单用例的人……对吧?! (我要疯了????)

想法?

【问题讨论】:

    标签: android realm realm-mobile-platform realm-java


    【解决方案1】:

    你可以这样做: 我的工作是使用过滤器获取更新的结果并通知您的适配器。 和其他解决方案 参考this code

    @Override
    public Flowable<RealmResults<Campaigns>> searchCampaigns(String nameQuery) {
    
    try (Realm realm = Realm.getDefaultInstance()) {   
    RealmQuery<Campaigns> query = realm.where(Campaigns.class)
    .contains(CampaignRealmFields.NAME, nameQuery, Case.INSENSITIVE)
    return query
            .findAllAsync()
            .asFlowable()
            .onBackpressureLatest()
            .toObservable()
            .flatMap(realmResultsCollectionChange -> 
                       query.findAllAsync().asChangesetObservable());
    
    }
    }
    
    
    
    searchCampaigns(something).subscribe(new Observer<CollectionChange<RealmResults<Campaigns>>>() {
                        @Override
                        public void onSubscribe(Disposable d) {
                            compositeDisposable.add(d);
                        }
    
                        @Override
                        public void onNext(CollectionChange<RealmResults<Campaigns>> realmResultsCollectionChange) {
                                                        ticketRealmResults=realmResultsCollectionChange.getCollection();
    
    
                                if (realmResultsCollectionChange.getChangeset().getChangeRanges().length > 1) {
                                    OrderedCollectionChangeSet.Range[] changerange = realmResultsCollectionChange.getChangeset().getChangeRanges();
                                    for (int i = changerange.length - 1; i >= 0; i--) {
                                        OrderedCollectionChangeSet.Range range = changerange[i];
                                        notifyItemRangeRemoved(range.startIndex, range.length);
                                    }
                                }
    
                                if (realmResultsCollectionChange.getChangeset().getDeletionRanges().length > 0) {
                                    OrderedCollectionChangeSet.Range[] deletionRanges = realmResultsCollectionChange.getChangeset().getDeletionRanges();
                                    for (int i = deletionRanges.length - 1; i >= 0; i--) {
                                        OrderedCollectionChangeSet.Range range = deletionRanges[i];
                                        notifyItemRangeRemoved(range.startIndex, range.length);
                                    }
                                }
    
                                if (realmResultsCollectionChange.getChangeset().getInsertionRanges().length > 0) {
    
                                    OrderedCollectionChangeSet.Range[] InsertionRanges = realmResultsCollectionChange.getChangeset().getInsertionRanges();
                                    for (int i = InsertionRanges.length - 1; i >= 0; i--) {
                                        OrderedCollectionChangeSet.Range range = InsertionRanges[i];
                                        notifyItemRangeRemoved(range.startIndex, range.length);
                                    }
                                }
                            }
    
                        }
    
                        @Override
                        public void onError(Throwable e) {
    
                        }
    
                        @Override
                        public void onComplete() {
    
                        }
                    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多