Kotlin Android Fragment recyclerView and context issue
Move this code
recylerView_Main.layoutManager = LinearLayoutManager(context)
recylerView_Main.adapter = Mainadapter()
from onCreateView
to onActivityCreated
override onActivityCreated
and place the above code.
There are two things incorrect in your code :
You are trying to access
recyclerView
even before inflating the View.The context of a Fragment is null in onCreateView and is usable in between
onAttach
andonDetach
Related videos on Youtube
GPH
Updated on June 14, 2022Comments
-
GPH about 2 years
I would like to create an recyclerView in a fragment, but it shows an error " java.lang.IllegalStateException: recylerView_Main must not be null at com.gph.bottomnavigation.FragmentMe.onCreateView(FragmentMe.kt:28)"
- Question 1) Please kindly help to solve this issue.
- Question 2) I created an recyclerView only in a empty project without any fragment, it is working properly.
But the same code is no working in Fragment, it shows error so I change "recylerView_Main.layoutManager = LinearLayoutManager(this)" to "recylerView_Main.layoutManager = LinearLayoutManager(context)" It shows no error and I can run in simlulator, but when I click the navigation button of the Fragment, the app stops and show this error. Please kindly help to solve it.
Here with the code for 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) } }
Here with the code of 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() } }
Here with the code of 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) { }
-
GPH about 6 yearsThank you very much! Can you explain why I have to change "recylerView_Main.layoutManager = LinearLayoutManager(this)" to "recylerView_Main.layoutManager = LinearLayoutManager(context)" when I run it in Fragment instead of MainActivitity?
-
coder3101 about 6 yearsFargments do not have a context, while activities have them, so you cannot use this for fragments.