Как инициализировать gridlayoutmanager во фрагменте, который использует cardview? - PullRequest
0 голосов
/ 12 июля 2020

Я новичок в использовании GridLayoutManager, и мне нужна помощь с его инициализацией. Я создал тестовую версию recyclerview с помощью cardview, и она отлично работала, когда мой код был помещен в mainactivity. Но теперь, когда я скопировал его в основной проект в свой HomeFragment, были показаны ошибки при инициализации менеджера GridLayout.

мой код в HomeFragment:

class HomeFragment : Fragment() {
private var recyclerView: RecyclerView? = null
private var charItem: ArrayList<CharItem>? = null
private var gridLayoutManager: GridLayoutManager? = null
private var alphaAdapters: AlphaAdapters? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    applicationContext
    recyclerView = findViewById(R.id.recycler_view_item)
    gridLayoutManager =
        GridLayoutManager(**applicationContext**, 2, LinearLayoutManager.VERTICAL, false)
    recyclerView?.layoutManager = gridLayoutManager
    recyclerView?.setHasFixedSize(true)
    charItem = ArrayList()
    charItem = setAlphas()
    alphaAdapters = AlphaAdapters(**applicationContext,** charItem!!)
    recyclerView?.adapter = alphaAdapters

}

private fun setAlphas(): ArrayList<CharItem> {

    var arrayList: ArrayList<CharItem> = ArrayList()

    arrayList.add(CharItem(R.drawable.image_3__2_, R.drawable.ic_nail,"Nail 
услуги")).....

}

Проблема в контексте приложения

Итак, проблема в коде HomeFragment, особенно с ApplicationContext в GridLayoutManager. Каково решение? Есть ли что-нибудь, что может мне помочь?

1 Ответ

0 голосов
/ 12 июля 2020

Жизненный цикл фрагмента немного отличается от 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> {
       // (....)
   }
}
...