返回
Android Jetpack 之 Paging3的一些踩坑记录
Android
2023-12-14 03:45:07
引言
最近在项目中使用了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库时遇到的问题和解决方案。希望本文对您有所帮助。