我有一个位于 RecyclerView 内的片段。我通过在
RecyclerView
中调用的 SQL 请求获取 OnViewCreated
的数据。
当我第一次进入这个片段时,
RecyclerView
正常出现,但是如果我离开这个Fragment
(通过后退按钮),然后再次进入这个Fragment
,RecyclerView
不会出现。所以 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 出现(但位置不好)
解决方案:
我找到了这个问题的解决方案:在设置适配器后,我再次将 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
获取数据后添加“RecyclerView.setAdapter(yourAdapter)”即可