使用喷气背包导航组件第二次进入碎片时,回收器视图不显示



我在RecyclerView中有一个Fragment。我通过在OnViewCreated中调用的SQL请求获得RecyclerView的数据。

当我第一次进入这个片段时,RecyclerView正常出现,但如果我离开这个Fragment(通过后退按钮(,然后再次进入这个FragmentRecyclerView不会出现。因此RecyclerView只显示一次。

以下是一些代码:

private var itemArray = arrayListOf<Item>()
private lateinit var itemRecycler: RecyclerView
private lateinit var itemAdapter: ItemAdapter
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.item_fragment, container, false)
itemRecycler = view.findViewById(R.id.item_recycler)
return  view
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
populateItemArray {
// Init Adapter
itemAdapter = ItemAdapter(itemArray)
// Set adapter to recycler
itemRecycler.apply {
layoutManager = LinearLayoutManager(context!!, LinearLayoutManager.HORIZONTAL, false)
adapter = itemAdapter
}
}
}
private fun populateItemArray(completion: () -> Unit) {
SQLiteManager(context!!).getItems() { defaultItemArray ->
itemArray.addAll(defaultItemArray.filter { it.itemId == 67 })
completion()
}
}

注意:每次进入这个片段,我都会得到一个包含近6个项目的列表。

我使用Jetpack Navigation Component。我第一次进入Fragment,那里一切正常,然后通过BackButton返回到上一个片段,最后像第一次一样再次进入Fragment,但RecyclerView没有出现(其他视图正常出现(。

编辑:

问题似乎是RecyclerView有android:layout_width="wrap_content"。当我使用match_parent时,会显示RecyclerView。我之所以使用wrap_content,是因为我想使RecyclerView居中。XML下方:

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/item_recycler"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/item_image"
app:layout_constraintBottom_toTopOf="@id/item_button"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:overScrollMode="never"/>

注意,当我设置像这样的新LayoutParams时

itemRecycler.layoutParams = ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT)

RecyclerView出现(但位置不正确(

解决方案:

我已经找到了这个问题的解决方案:在设置Adapter:之后,我再次将RecyclerView的宽度设置为wrap_content

val params = itemRecycler.layoutParams
params.width = ConstraintLayout.LayoutParams.WRAP_CONTENT
itemRecycler.layoutParams = params
itemRecycler.requestLayout()

这为我解决了问题。谢谢你的帮助,我希望它能对某人有用。

抱歉我英语不好,谢谢你的帮助

我在从服务器获取结果后再次设置适配器,解决了这个问题

contactsAdapter = ContactsAdapter(this, readContactsArray)
contactsRecyclerView.adapter = contactsAdapter

最新更新