【发布时间】:2017-10-21 03:51:04
【问题描述】:
我试图有一个嵌套的 RecyclerView,其中水平 RecyclerView 将显示为 Vertical RecyclerView 的一个项目。 (用户界面类似于 Google Play 商店)
由于我的数据集在 FirebaseFirestore 中,因此我使用 FirestoreRecyclerAdapter 来实现此目的。
我的 Fragment 的代码(这里有父 RecyclerView):
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
val view = inflater.inflate(R.layout.layout_recyclerview, container, false)
val query = <some reference>
val recycler = view.recyclerView
recycler.setHasFixedSize(true)
adapter = DashboardAdapter(this,
FirestoreRecyclerOptions.Builder<Category>().categoryOption(query, this),
R.layout.item_dashboard_row)
recycler.adapter = adapter
return view
}
DashboardAdapter sn-p:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DashboardHolder {
val item = LayoutInflater.from(parent.context)
.inflate(layout, parent, false)
return DashboardHolder(item)
}
DashboardHolder sn-p:
internal class DashboardHolder(item: View) : RecyclerView.ViewHolder(item) {
private val rowTitle: TextView = item.rowTitle
private val rowRecycler: RecyclerView = item.rowRecycler
fun bind(category: Category, owner: LifecycleOwner) {
rowTitle.text = category.name
rowRecycler.setHasFixedSize(true)
val query = <some query>
val adapter = DashboardProductsAdapter(
FirestoreRecyclerOptions.Builder<Product>()
.productOption(query, owner),
R.layout.item_dashboard_product)
rowRecycler.adapter = adapter
}
}
很明显,DashboardHolder(父视图持有者)里面有 RecyclerView。在绑定时,子适配器被创建并设置为子 RecyclerView。
当我第一次加载 Fragment 时,一切正常并且加载正常。但是在我单击主页按钮并再次返回应用程序后,只有父级 RecyclerView 被填充,而不是子级。
在我开始挖掘更多之后,发现这是因为LifecycleOwner我在创建FirestoreRecyclerOptions时路过。如果我不设置它并手动调用startListening() 和stopListening(),那么行为也是相同的。但是如果我不打电话给stopListening(),它就可以正常工作。
更新了 Fragment 的代码:
override fun onStart() {
super.onStart()
adapter.startListening()
}
override fun onStop() {
super.onStop()
// If I comment this out, everything works fine
// But putting this in code doesn't populate the child RecyclerView 2nd time
adapter.stopListening()
}
可能的问题是什么?我应该在 bind() 方法之外创建子适配器吗?我是否应该跳过stopListening() 回调,但这可能会导致内存泄漏。
【问题讨论】:
-
嗨@Chandra Sekhar,我在使用Firestore RecyclerView时遇到了同样的问题,在我的情况下,我在父RecyclerView的onBindViewHolder中调用嵌套回收器视图的adapter.startListening()并且从不调用adapter.stopListening( )。该应用程序可以正常工作一段时间,但开始挂起并最终崩溃,我认为这可能是因为多次调用 adapter.startListening() 而没有停止导致内存泄漏。你有没有找到任何解决方案。任何帮助将不胜感激。
标签: android android-recyclerview firebaseui google-cloud-firestore android-architecture-components