Жизненный цикл фрагмента немного отличается от Activity, в первую очередь вам нужно разбить инициализацию представления, потому что он имеет отдельный жизненный цикл (в отличие от Activity его можно отсоединить и под go уничтожить представление, оставив сам фрагмент нетронутым). Для этого вы должны использовать метод onViewCreated
и реализовать onDestroyView
для очистки ссылок на представления.
Лучшая практика внутри фрагмента для получения контекста - использовать requireContext()
, тогда вы можете перейти к извлечению applicationContext
из него, если требуется.
Также фрагмент не имеет метода setContentView
. Вам нужно либо переопределить метод onCreateView
, либо, если вы используете макет stati c, вы можете использовать вместо него конструктор Fragment (int contentLayoutId)
:
class HomeFragment : Fragment(R.layout.activity_main) {
private var alphaAdapters: AlphaAdapters? = null
private var charItem: ArrayList<CharItem>? = null
private var recyclerView: RecyclerView? = null
private var gridLayoutManager: GridLayoutManager? = null
// initialize adapter in onCreate, it's unaffected by views state
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
charItem = ArrayList()
charItem = setAlphas()
alphaAdapters = AlphaAdapters(requireContext(), charItem!!)
}
// initialize recyclerView and layout manager
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
gridLayoutManager = GridLayoutManager(requireContext(), 2, LinearLayoutManager.VERTICAL, false)
recyclerView = view.findViewById(R.id.recycler_view_item).also {
it.layoutManager = gridLayoutManager
it.setHasFixedSize(true)
it.adapter = alphaAdapters
}
}
// release recyclerView and layout manager
override fun onDestroyView() {
super.onDestroyView()
recyclerView?.adapter = null
recyclerView = null
gridLayoutManager = null
}
private fun setAlphas(): ArrayList<CharItem> {
// (....)
}
}