【问题标题】:Android remove RecyclerView refresh animationAndroid去掉RecyclerView刷新动画
【发布时间】:2020-09-02 19:08:36
【问题描述】:

我正在使用 FirestorePagingAdapter 使用来自 Firestore 查询的数据填充 RecyclerView。每次用户使用 SwipeRefreshLayout 刷新数据或使用简单的搜索功能时,RecyclerView 都会闪烁以更新内容。我希望我可以删除谁的闪烁,以便已经加载/缓存的数据保持不变。

我试图删除 RecyclerView 动画,但它只是加快了这些闪烁。我想我应该使用 onDataSetChanged() 实现 DataSnapshotListener 来监听更新并防止适配器更新视图。但我找不到合适的解决方案。

我以这种方式刷新内容:

swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                Adapter.refresh();
            }
        });

我使用查询更新来实现搜索功能:

private void listSearch (String searchText) {
        String newSearch = searchText.toLowerCase();
        Query searchQuery = Reference.whereGreaterThanOrEqualTo("title", newSearch);
        FirestorePagingOptions<Adapter> searchOptions = new FirestorePagingOptions.Builder<Adapter>().setLifecycleOwner(this).setQuery(searchQuery, pagerConfig, Adapter.class).build();
        Adapter.updateOptions(searchOptions);
    }

编辑:我尝试在 getItemId() 中使用 Firestore 中的文档 ID。但没有成功。在我的数据库中创建了一个具有长属性的新字段。并尝试使用它。再次没有成功。 (

            @Override
            public long getItemId(int position) {
            DocumentSnapshot snapshot = getItem(position);
            assert snapshot != null;
            Long order = snapshot.getLong("order");
            return order;
        }

【问题讨论】:

    标签: android android-recyclerview google-cloud-firestore


    【解决方案1】:

    闪烁效果通常发生在您不使用StableIds 时,因此RecyclerView 会在您每次刷新时尝试使用新的ViewHolder

    要解决此问题,请在您的 Adapter 类中使用 setHasStableIds(true),然后确保将 getItemId(int position) 覆盖为有意义的内容,例如正在搜索的项目的 id 或类似内容。永远不要将职位本身作为 Id 返回。

    【讨论】:

    • 我卡在这里了。我在我的模型类中创建了一个新字段,并从那里传递了 firebase 的文档 ID。但我无法意识到如何将它连接到 getItemId()。我已经更新了我的问题。也许有人可以提供一些澄清。
    猜你喜欢
    • 2017-11-11
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多