Получение ошибки findViewById при инициализации просмотра повторов в фрагменте - PullRequest
0 голосов
/ 18 апреля 2020

Я протестировал этот код в другом проекте, где я не использовал фрагмент и написал его в MainActivity.kt, он работает. Но проблема возникает, когда я создаю другой проект с использованием фрагмента, поэтому я пишу его в новом классе (HerbalFragment.kt). Он получает ошибку в «findViewById» для инициатора Recyclerview, а также получает ошибку в «this». Вот мой код (HerbalFragment.kt)

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView

/**
 * A simple [Fragment] subclass.
 */
class HerbalFragment : Fragment() {
    private lateinit var rvHerbal: RecyclerView
    private var list: ArrayList<Herbal> = arrayListOf()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        // Inflate the layout for this fragment
        super.onViewCreated(view, savedInstanceState)
        return inflater.inflate(R.layout.fragment_herbal, container, false)

        rvHerbal = findViewById(R.id.rv_herbal)
        rvHerbal.setHasFixedSize(true)
        list.addAll(HerbalData.listData)
        showRecyclerList()
    }

    private fun showRecyclerList() {
        rvHerbal.layoutManager = LinearLayoutManager(this)
        val listHerbalAdapter = ListHerbalAdapter(list)
        rvHerbal.adapter = listHerbalAdapter
    }
}[![enter image description here][1]][1]

Помогите мне, пожалуйста, спасибо, прежде чем

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Вам не нужно искать представление, если вы используете привязку данных kotlin этим простым способом

добавьте импорт к этому (фрагмент_хербал - ваше xml имя файла представления макета)

import kotlinx.android.synthetic.main.fragment_herbal.*

затем

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    return inflater.inflate(R.layout.fragment_herbal, container, false)
}

, затем используйте ваш элемент просмотра без findviewbyid

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    rvHerbal.setHasFixedSize(true)
    list.addAll(HerbalData.listData)
    showRecyclerList()
}
0 голосов
/ 18 апреля 2020

Насколько я заметил, ваш код недоступен,

 override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

    // Inflate the layout for this fragment
    super.onViewCreated(view, savedInstanceState)
    return inflater.inflate(R.layout.fragment_herbal, container, false)

    // unreachable code you are already return the view so below code will never execute
    rvHerbal = findViewById(R.id.rv_herbal)
    rvHerbal.setHasFixedSize(true)
    list.addAll(HerbalData.listData)
    showRecyclerList()
}

Чтобы решить эту проблему, вам нужно изменить код, как я и предлагал.

 override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

     return  inflater.inflate(R.layout.fragment_herbal, container, false)


}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
   // do what ever you want here like find view ids and etc...
      rvHerbal = findViewById(R.id.rv_herbal)
rvHerbal.setHasFixedSize(true)
list.addAll(HerbalData.listData)
showRecyclerList()

    }
}

 private fun showRecyclerList() {
    rvHerbal.layoutManager = LinearLayoutManager(activity!!)
    val listHerbalAdapter = ListHerbalAdapter(list)
    rvHerbal.adapter = listHerbalAdapter
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...