我在RecyclerView中有一个Fragment。我通过在OnViewCreated
中调用的SQL请求获得RecyclerView
的数据。
当我第一次进入这个片段时,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出现(但位置不正确(
解决方案:
我已经找到了这个问题的解决方案:在设置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