返回

Android Jetpack 之 Paging3的一些踩坑记录

Android

引言

最近在项目中使用了Paging3库来做分页加载,使用时多多少少遇到到了一些问题,去翻了源码发现Paging3的实现涉及到挺多协程的内容,但是自己对协程也是一知半解,所以文中的看法以及解决方案可能存在错误或不合理的地方。写这篇文章的时候虽然网上的使用教程寥寥无几,但是仅有的几篇讲的都很详细。结合官方的文档Paging3的学习成本还是有的。

问题一:无法在同一个Activity中使用多个PagingDataAdapter

在项目中我们需要在同一个Activity中使用多个列表,每个列表都需要使用Paging3库来做分页加载。但是,当我们使用多个PagingDataAdapter时,会出现一些问题。

解决方案:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 创建第一个PagingDataAdapter
        val adapter1 = PagingDataAdapter()

        // 创建第二个PagingDataAdapter
        val adapter2 = PagingDataAdapter()

        // 设置两个列表的Adapter
        recyclerView1.adapter = adapter1
        recyclerView2.adapter = adapter2

        // 创建两个PagingSource
        val pagingSource1 = PagingSource()
        val pagingSource2 = PagingSource()

        // 创建两个Pager
        val pager1 = Pager(
            config = PagingConfig(pageSize = 20),
            initialKey = null,
            pagingSourceFactory = { pagingSource1 }
        )
        val pager2 = Pager(
            config = PagingConfig(pageSize = 20),
            initialKey = null,
            pagingSourceFactory = { pagingSource2 }
        )

        // 监听两个Pager的LiveData
        pager1.liveData.observe(this) {
            adapter1.submitData(it)
        }
        pager2.liveData.observe(this) {
            adapter2.submitData(it)
        }
    }

问题二:无法在同一个Fragment中使用多个PagingDataAdapter

在项目中,我们还需要在同一个Fragment中使用多个列表,每个列表都需要使用Paging3库来做分页加载。但是,当我们使用多个PagingDataAdapter时,也会出现一些问题。

解决方案:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_main, container, false);

        // 创建第一个PagingDataAdapter
        val adapter1 = PagingDataAdapter()

        // 创建第二个PagingDataAdapter
        val adapter2 = PagingDataAdapter()

        // 设置两个列表的Adapter
        recyclerView1.adapter = adapter1
        recyclerView2.adapter = adapter2

        // 创建两个PagingSource
        val pagingSource1 = PagingSource()
        val pagingSource2 = PagingSource()

        // 创建两个Pager
        val pager1 = Pager(
            config = PagingConfig(pageSize = 20),
            initialKey = null,
            pagingSourceFactory = { pagingSource1 }
        )
        val pager2 = Pager(
            config = PagingConfig(pageSize = 20),
            initialKey = null,
            pagingSourceFactory = { pagingSource2 }
        )

        // 监听两个Pager的LiveData
        pager1.liveData.observe(viewLifecycleOwner) {
            adapter1.submitData(it)
        }
        pager2.liveData.observe(viewLifecycleOwner) {
            adapter2.submitData(it)
        }

        return view;
    }

问题三:无法使用Paging3库来加载数据

在项目中,我们需要使用Paging3库来加载数据,但是,在使用时,却发现无法加载数据。

解决方案:

    // 创建一个PagingSource
    val pagingSource = PagingSource()

    // 创建一个Pager
    val pager = Pager(
        config = PagingConfig(pageSize = 20),
        initialKey = null,
        pagingSourceFactory = { pagingSource }
    )

    // 监听Pager的LiveData
    pager.liveData.observe(this) {
        adapter.submitData(it)
    }

问题四:无法使用Paging3库来更新数据

在项目中,我们需要使用Paging3库来更新数据,但是,在使用时,却发现无法更新数据。

解决方案:

    // 创建一个PagingSource
    val pagingSource = PagingSource()

    // 创建一个Pager
    val pager = Pager(
        config = PagingConfig(pageSize = 20),
        initialKey = null,
        pagingSourceFactory = { pagingSource }
    )

    // 监听Pager的LiveData
    pager.liveData.observe(this) {
        adapter.submitData(it)
    }

    // 更新数据
    pagingSource.invalidate()

问题五:无法使用Paging3库来删除数据

在项目中,我们需要使用Paging3库来删除数据,但是,在使用时,却发现无法删除数据。

解决方案:

    // 创建一个PagingSource
    val pagingSource = PagingSource()

    // 创建一个Pager
    val pager = Pager(
        config = PagingConfig(pageSize = 20),
        initialKey = null,
        pagingSourceFactory = { pagingSource }
    )

    // 监听Pager的LiveData
    pager.liveData.observe(this) {
        adapter.submitData(it)
    }

    // 删除数据
    pagingSource.delete(key)

总结

本文讨论了在使用Paging3库时遇到的问题和解决方案。希望本文对您有所帮助。