How can I fix this Attempt to invoke virtual method
Нужна ваша помощь! Я пытаюсь использовать RecyclerView с TabsLayout. Когда я пытаюсь запустить свое приложение, я получаю фатальное исключение:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.listtask/com.example.listtask.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setLayoutManager(androidx.recyclerview.widget.RecyclerView$LayoutManager)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setLayoutManager(androidx.recyclerview.widget.RecyclerView$LayoutManager)' on a null object reference
at com.example.listtask.MainActivity.onCreate(MainActivity.kt:26)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
MainActivity.kt
class MainActivity : AppCompatActivity() {
private var layoutManager: RecyclerView.LayoutManager? = null
private var adapter: RecyclerView.Adapter<RecyclerAdapter.ViewHolder>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
layoutManager = LinearLayoutManager(this)
recyclerView.layoutManager = layoutManager
adapter = RecyclerAdapter()
recyclerView.adapter = adapter
setTabs()
}
private fun setTabs() {
val adapter = ViewPagerAdapter(supportFragmentManager)
adapter.addFragment(AllFragment(), "All")
adapter.addFragment(FavouritesFragment(), "Favourites")
viewPager.adapter = adapter
tabs.setupWithViewPager(viewPager)
}
}
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabGravity="fill"
app:tabInlineLabel="true"
app:tabMode="fixed"
app:tabTextAppearance="@style/CustomTabStyle"
app:tabTextColor="@color/black" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/appBarLayout" />
</RelativeLayout>
AllFragment.kt
class AllFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_all, container, false)
}
}
fragment_all.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".fragments.AllFragment">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Со всем этим работаю впервые. Не судите строго, новичок в программировании, но на форуме это первый вопрос. Спасибо за понимание. Если возможно, то дайте ответ с пояснением, чтоб разобраться и понять!
RecyclerAdapter.kt
class RecyclerAdapter: RecyclerView.Adapter<RecyclerAdapter.ViewHolder>() {
private var titles = arrayOf("Chapter One", "Chapter Two", "Chapter Three", "Chapter Four", "Chapter Five", "Chapter Six", "Chapter Seven", "Chapter Eight", "Chapter Nine", "Chapter Ten")
private var description = arrayOf("This chapter will tell us about something strange, horrible and fantastic, beautiful and peaceful.", "This chapter will tell us about something strange, horrible and fantastic!", "This chapter will tell us about something strange, horrible and fantastic, differ and deeper, honorably and beautiful, lovely and funny.", "This chapter will tell us about something horrible.", "This chapter will tell us about something strange, horrible and fantastic, enthusiastic!", "This chapter will tell us about something fantastic, funny, lovely, erudition, peaceful.", "This chapter will tell us about something strange, horrible and fantastic, beautiful!", "This chapter will tell us about something strange, horrible and peaceful.", "This chapter will tell us about something strange, horrible.", "This chapter will tell us about something strange, horrible and fantastic.")
private var date = arrayOf("22.05.2021", "23.05.2021", "24.05.2021", "15.03.2021", "14.03.2021", "12.02.2021", "19.01.2021", "09.01.2021", "15.09.2021", "11.07.2021")
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerAdapter.ViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.model, parent, false)
return ViewHolder(v)
}
override fun onBindViewHolder(holder: RecyclerAdapter.ViewHolder, position: Int) {
holder.itemTitle.text = titles[position]
holder.itemDescription.text = description[position]
holder.itemDate.text = date[position]
}
override fun getItemCount(): Int {
return titles.size
}
inner class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
var itemTitle: TextView
var itemDescription: TextView
var itemDate: TextView
var itemLike: CheckBox
init {
itemTitle = itemView.findViewById(R.id.itemTitle)
itemDescription = itemView.findViewById(R.id.itemDescription)
itemDate = itemView.findViewById(R.id.itemDate)
itemLike = itemView.findViewById(R.id.itemLike)
itemView.setOnClickListener {
val position: Int = adapterPosition
Toast.makeText(itemView.context, "You clicked on ${titles[position]}", Toast.LENGTH_LONG).show()
}
}
}
}
ViewPagerAdapter.kt
class ViewPagerAdapter(supportFragmentManager: FragmentManager) :
FragmentPagerAdapter(supportFragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
private val mFragmentList = ArrayList<Fragment>()
private val mFragmentTitleList = ArrayList<String>()
override fun getCount(): Int {
return mFragmentList.size
}
override fun getItem(position: Int): Fragment {
return mFragmentList[position]
}
override fun getPageTitle(position: Int): CharSequence {
return mFragmentTitleList[position]
}
fun addFragment(fragment: Fragment, title: String) {
mFragmentList.add(fragment)
mFragmentTitleList.add(title)
}
}
Измененный AllFragment.kt
class AllFragment : Fragment() {
private var layoutManager: RecyclerView.LayoutManager? = null
private var adapter: RecyclerView.Adapter<RecyclerAdapter.ViewHolder>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val recyclerView = view?.findViewById<RecyclerView>(R.id.recyclerView)
layoutManager = LinearLayoutManager(requireActivity())
recyclerView?.layoutManager = layoutManager
adapter = RecyclerAdapter()
recyclerView?.adapter = adapter
return inflater.inflate(R.layout.fragment_all, container, false)
}
}