RecyclerView не появляется при повторном входе во фрагмент с навигационным компонентом Jetpack - PullRequest
0 голосов
/ 30 октября 2019

У меня есть фрагмент внутри 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()

Это решило проблему для меня. Спасибо за вашу помощь, я надеюсь, что это может быть полезно для кого-то.

Извините за мой плохой английский, и спасибо за вашу помощь

...