Kotlin Android Fragment recyclerПросмотр и проблема контекста - PullRequest
0 голосов
/ 19 мая 2018

Я хотел бы создать recyclerView во фрагменте, но он показывает ошибку "java.lang.IllegalStateException: recylerView_Main не должен быть нулевым в com.gph.bottomnavigation.FragmentMe.onCreateView (FragmentMe.kt: 28)"

  • Вопрос 1) Пожалуйста, помогите решить эту проблему.
  • Вопрос 2) Я создал recyclerView только в пустом проекте без какого-либо фрагмента, он работает правильно.

enter image description here

Но тот же код не работает во фрагменте, он показывает ошибку, поэтому я изменяю "recylerView_Main.layoutManager = LinearLayoutManager (this)"to "recylerView_Main.layoutManager = LinearLayoutManager (context)" Это не показывает ошибки, и я могу работать в симуляторе, но когда я нажимаю кнопку навигации фрагмента, приложение останавливается и показывает эту ошибку.Пожалуйста, помогите решить это.enter image description here

Здесь с кодом FragmentMe.kt:

class FragmentMe : Fragment() {

        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,


               savedInstanceState: Bundle?): View? {

        recylerView_Main.layoutManager = LinearLayoutManager(context)
        recylerView_Main.adapter = Mainadapter()

        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_me, container, false)
    }

}

Здесь с кодом MainActivity.kt:

class MainActivity : AppCompatActivity() {

    val manager = supportFragmentManager

    private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            R.id.navigation_home -> {
                //message.setText(R.string.title_home)
                createFragmentQpon()
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_dashboard -> {
                //message.setText(R.string.title_dashboard)
                createFragmentMe()
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_notifications -> {
                //message.setText(R.string.title_notifications)
                createFragmentTools()
                return@OnNavigationItemSelectedListener true
            }

        }
        false
    }

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

        //Action Bar
        val actionBar = supportActionBar
        actionBar!!.setDisplayShowHomeEnabled(true)
        actionBar.setBackgroundDrawable(ColorDrawable(Color.parseColor("#00FFFFFF")))
        actionBar.setIcon(R.drawable.ic_home_black_24dp)
        actionBar.setDisplayShowTitleEnabled(false)

        createFragmentQpon()
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
    }

    fun createFragmentQpon() {
        val transaction = manager.beginTransaction()
        val fragment = FragmentQpon()
        transaction.replace(R.id.fragmentholder,fragment)
        transaction.addToBackStack(null)
        transaction.commit()
    }

    fun createFragmentMe() {
        val transaction = manager.beginTransaction()
        val fragment = FragmentMe()
        transaction.replace(R.id.fragmentholder,fragment)
        transaction.addToBackStack(null)
        transaction.commit()
    }

    fun createFragmentTools() {
        val transaction = manager.beginTransaction()
        val fragment = FragmentTools()
        transaction.replace(R.id.fragmentholder,fragment)
        transaction.addToBackStack(null)
        transaction.commit()
    }



}

Здесь с кодом Mainadapter.kt:

class Mainadapter: RecyclerView.Adapter<CustomViewHolder>() {

    val videolist = listOf("aaa","bbbb","cccc")

    override fun getItemCount(): Int {
        return  3
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {

        val layoutInflater = LayoutInflater.from(parent?.context)
        val cellForRow = layoutInflater.inflate(R.layout.tutorial_layout, parent, false)
        return CustomViewHolder(cellForRow)

    }

    override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {

        var videoName = videolist.get(position)


        holder.itemView.title.text = videoName

    }


}

class CustomViewHolder(v: View): RecyclerView.ViewHolder(v) {
}

1 Ответ

0 голосов
/ 19 мая 2018

Переместите этот код

recylerView_Main.layoutManager = LinearLayoutManager(context)
recylerView_Main.adapter = Mainadapter()

из onCreateView в onActivityCreated

переопределить onActivityCreated и поместите приведенный выше код.

Есть две неверные вещив вашем коде:

  1. Вы пытаетесь получить доступ к recyclerView даже до надувания представления.

  2. Контекст фрагмента нулевой вonCreateView и может использоваться между onAttach и onDetach

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...