PagedListAdapter 不使用 DiffUtil 使数据无效

2024-03-12

每次我调用无效数据时,我的 DIFF_UTIL 都不会被使用。日志未显示,整个列表已更新为新数据,导致屏幕移动位置等。不确定这里的问题是什么。

I have PagedListAdapter with a LiveData<PagedList<Post>> postList我打电话给postList.getValue().getDataSource().invalidate();刷新我的数据。

I have DIFF_UTIL

 public static DiffUtil.ItemCallback<Post> DIFF_CALLBACK =
            new DiffUtil.ItemCallback<Post>() {

                @Override
                public boolean areItemsTheSame(Post oldItem, Post newItem) {
                    Log.d(TAG, "areItemsTheSame with result: "
                            + (oldItem.getId() == newItem.getId()));
                    Log.d(TAG, "areItemsTheSame Old Item is: " + oldItem.toString());
                    Log.d(TAG, "areItemsTheSame New Item is: " + newItem.toString());
                    return oldItem.getId() == newItem.getId();
                }

                @Override
                public boolean areContentsTheSame(Post oldItem, Post newItem) {
                    Log.d(TAG, "areContentsTheSame with result: " + oldItem.equals(newItem));
                    Log.d(TAG, "areContentsTheSame Old Item is: " + oldItem.toString());
                    Log.d(TAG, "areContentsTheSame New Item is: " + newItem.toString());
                    return oldItem.equals(newItem);
                }
            };

我有我的适配器:

import...

public class PostAdapter extends PagedListAdapter<Post, PostAdapter.PostViewHolder> {
    interface...

    protected PostAdapter() {
        super(DIFF_CALLBACK);
    }

    @NonNull
    @Override
    public PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater
                .from(parent.getContext()).inflate(R.layout.feed_card_view, parent, false);
        return new PostViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull PostViewHolder holder, int position) {
        Post post = getItem(position);
        Log.d(TAG, "onBindViewHolder with position: " + position);
        if (post != null) {
            setUpPost(holder, post);
            Log.d(TAG, "onBindViewHolder with post: " + post.toString());
        } else {
            holder.clear();
            Log.d(TAG, "onBindViewHolder post is null");
        }
    }

    private void setUpPost(@NonNull PostViewHolder holder, @NonNull Post post) {
       ...do some things to set up post
    }

    class PostViewHolder extends RecyclerView.ViewHolder {
       Buttons etc..

        public PostViewHolder(View itemView) {
            super(itemView);
            button b = findviewbyid...
        }

        void clear() {
            button.invalidate()..
        }
    }
}

我的片段

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_feed, container, false);
        feedViewModel = ViewModelProviders.of(getActivity()).get(FeedViewModel.class);

        RecyclerView recyclerView = v.findViewById(R.id.post_list);
        PostAdapter adapter = new PostAdapter(this);

        feedViewModel.postList.observe(this, pagedList -> {
            try {
                //refresh current list
                adapter.submitList(pagedList);
            } catch (Exception e) {}
        });


        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity()));

        return v;
    }

我的视图模型

public class FeedViewModel extends AndroidViewModel {
    private LiveData<PagedList<Post>> postList;
    private FeedRepository feedRepository;

    public FeedViewModel(final Application application) {
        super(application);
        feedRepository = new FeedRepository();
        postList = feedRepository.getPosts();
    }

    public void refreshPosts() {
        feedRepository.refreshPosts();
    }

    ... 

    public LiveData<PagedList<Post>> getPostList() {
        return postList;
    }
}

知识库

public class FeedRepository {
    private LiveData<PagedList<Post>> postList;

    private static final String TAG = FeedRepository.class.getName();
    private static final int NUMBER_OF_POSTS_TO_GET = 2;
    private static final boolean ENABLE_POST_PAGE_HOLDER = true;
    private static final int NUMBER_OF_POSTS_TO_GET_IN_ADVANCE = 50;
    private static final int NUMBER_OF_POSTS_ON_FIRST_LOAD = 20;

    public FeedRepository() {
        //Prefs on PagedList
        PagedList.Config myPagingConfig = new PagedList.Config.Builder()
                .setPageSize(NUMBER_OF_POSTS_TO_GET)
                .setEnablePlaceholders(ENABLE_POST_PAGE_HOLDER)
                .setPrefetchDistance(NUMBER_OF_POSTS_TO_GET_IN_ADVANCE)
                .setInitialLoadSizeHint(NUMBER_OF_POSTS_ON_FIRST_LOAD)
                .build();

        PostDataSourceFactory postDataSourceFactory = new PostDataSourceFactory();

        postList = new LivePagedListBuilder(
                postDataSourceFactory, myPagingConfig).build();
    }

    public LiveData<PagedList<Post>> getPosts() {
        return postList;
    }

    public void refreshPosts() {
        Log.d(TAG, "refreshPosts, invalidateDataSources()");
        postList.getValue().getDataSource().invalidate();
    }
}

数据源.工厂

public class PostDataSourceFactory extends DataSource.Factory<String, Post> {
   public PostDataSourceFactory() {
    }

    @NonNull
    @Override
    public DataSource<String, Post> create() {
        PostDataSource postDataSource = new PostDataSource();
        return postDataSource;
    }
}

我在这里遵循谷歌的例子:https://developer.android.com/reference/android/arch/paging/PagedListAdapter.html https://developer.android.com/reference/android/arch/paging/PagedListAdapter.html


对于其他对“DiffUtil.ItemCallback()”部分有问题的人,我也遇到了同样的问题。

每次我想刷新数据时,我都会在“DataSource”对象上调用 invalidate(),具体取决于您继承的数据源的类型,但是 2 个回调“areItemsTheSame()”和“areContentsTheSame()”没有被触发。

所以我发现了这个链接:如何使用架构组件分页库停止在回收器视图上闪烁 https://stackoverflow.com/questions/48438944/how-to-stop-blinking-on-recycler-view-with-architecture-components-paging-librar

对我来说,诀窍是在提交“pagedList”时使用“AsyncPagedListDiffer”。下面的代码是 Kotlin 语言的。

fun submitList(pagedList: PagedList<*?>) {
  pagedList.addWeakCallback(pagedList.snapshot(), object : PagedList.Callback() {
    override fun onChanged(position: Int, count: Int) {
    }

    override fun onInserted(position: Int, count: Int) {
      mDiffer.submitList(pagedList)
    }

    override fun onRemoved(position: Int, count: Int) {
    }

  })
}

通过添加这些东西,我的 diff 回调开始工作

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PagedListAdapter 不使用 DiffUtil 使数据无效 的相关文章

随机推荐

  • 海龟模块中的 onkeypress() 函数问题

    每当我尝试运行代码并按键盘上的 w s 向上 或 向下 键时 对象都不会移动 onkeypress 功能不起作用 我尝试将其替换为onkey 功能 但无济于事 下面是我的代码 import turtle wn turtle Screen w
  • Material-ui:图标的轮廓版本

    我在我的 React Web 应用程序中使用material ui 我需要组件中的图标 操作 描述 但在outline版本 根据文档 为了方便起见 提供了全套 google Material 图标 在 Material UI 中作为预构建的
  • 从 VBScript 读取 DLL(或 VB6)文件

    我正在尝试使用 VBScript 访问 VBA 文件 或 DLL 中的函数 我有点力不从心 而且我通常不使用这两种语言 所以我会解释一下情况 以防有更好的解决方案 我有一个仪器 它有一个类似 VBScript 的内部窗口 它具有 VBScr
  • Java Swing KeyStrokes:如何使 CTRL 修饰符起作用

    In the following program why does hitting the a key print hello world while hitting CTRL a doesn t import java awt event
  • Jquery 隔离

    我的公司有一个 Web 应用程序 其中包含纯 JavaScript 它以自己的方式使用 美元符号 如下所示 function e return document getElementById e 问题是当我将 jquery 嵌入到页面时发生
  • 如何限制受保护方法只能访问子类

    我们如何限制对任何受保护方法的访问仅限于任何包中的子类 而不是同一包中的类 如果任何类不是子类并且位于同一包中 它也必须抛出异常 例如 受保护的方法 编辑 有什么方法可以检查调用类名实例 然后我们可以使用进行验证实例化 这不可能 您可以选择
  • 依赖注入容器?它有什么作用?

    我一直在阅读有关 DI 的内容 它似乎是一个足够简单的概念 我没有得到的是容器 假设我想创建自己的容器 使用像 检测 这样的动词 我不明白容器如何 检测 创建了新的依赖对象并知道注入它的依赖项 对我来说 这个容器就像是一个光荣的工厂 谁能解
  • Azure静态Web应用程序环境变量

    我正在尝试通过 Azure Static Web 应用程序发布 Gatsbyjs 我有一个插件 gatsby source contentful 我需要传递如下变量 resolve gatsby source contentful opti
  • 如何调试 vscode 扩展的 WebView javascript

    我正在构建 vscode 扩展 但无法在 WebView 中的 Javascript 中设置断点 即使 WebView 是一个单独的进程 有没有办法调试 Javascript 具体来说 我正在尝试合并 Telerik TreeView Tr
  • OpenCV 3.4.3 中对“cv::String::deallocate()”错误的未定义引用[重复]

    这个问题在这里已经有答案了 我最近安装了 OpenCV 3 4 3 但 OpenCV 中的一些库没有运行 这是我的示例代码 include
  • 将 Youtube Gdata json 解析为 ListView

    我一直在尝试在 Android 中找到 解析 Youtube Gdata JSON 的工作示例来填充列表视图 我一直在阅读这个问题 https stackoverflow com questions 9555511 android pars
  • RxJava 并行获取 Observables

    我需要一些帮助来在 RxJava 中实现并行异步调用 我选择了一个简单的用例 其中第一个调用获取 而不是搜索 要显示的产品列表 平铺 随后的调用将获取 A 评论和 B 产品图像 经过几次尝试我到达了这个地方 1 Observable
  • 找不到实体框架 4 注释

    我正在尝试使用注释将 POCO 类映射到我的数据库表 我需要使用Table注释来指定我的表的名称 但我无法解析Table注解 注 我导入了System Data Entity命名空间 但它不起作用 我必须导入哪个命名空间才能使用 EF 注释
  • Flutter Admob AppID 使用 Android 还是 iOS?

    当我们在admob控制台中制作AdMob应用程序时 我们可以选择Android或iOS应用程序 这意味着有 2 个不同的 ID 我们应该在 Flutter AdMob 插件中使用哪一个 FirebaseAdMob instance init
  • 如何将 Rails 视图助手提取到 gem 中?

    我有一组经常使用的 Rails 视图助手 并且想将它们打包成一个 gem 这样我就可以在 Gemfile 中添加一行 并从我的视图中访问这些助手 我在使用 Bundler 和 Jeweler 之前已经创建了 gem 但是 我不太清楚如何在
  • 从回溯的角度解释BFS和DFS

    关于深度优先搜索的维基百科 深度优先搜索 DFS 是一种 遍历或搜索的算法 树 树结构或图 一 从根开始 选择一些 节点作为图例中的根 并尽可能地探索回溯之前的每个分支 那么什么是广度优先搜索呢 一种选择起始点的算法 节点 检查所有节点回溯
  • 通过代码隐藏加载silverlight到aspx页面

    我需要通过单击该页面上的按钮在 aspx 页面的一部分中加载 silverlight 应用程序 一些初始化参数需要根据单击按钮时主机页面上的用户输入传递到 silverlight 应用程序 怎么做 我想我需要从代码隐藏创建 silverli
  • python中用于列表操作的plus和append有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 Python的append 与列表上的 运算符 为什么它们会给出不同的结果 https stackoverflow com questions 2022031 python append vs ope
  • 如何查看 nginx 尝试访问文件的实际文件路径?

    现在我已经设置了 Nginx 来提供我确信是有效的文件路径的服务 但是 它给了我一个 404 未找到 我看过 var log nginx access log它向我展示了 05 Oct 2016 19 15 50 0500 GET menu
  • PagedListAdapter 不使用 DiffUtil 使数据无效

    每次我调用无效数据时 我的 DIFF UTIL 都不会被使用 日志未显示 整个列表已更新为新数据 导致屏幕移动位置等 不确定这里的问题是什么 I have PagedListAdapter with a LiveData