使用ViewPager时Fragment内RecyclerView出现空指针异常求助
ViewPager中Fragment绑定RecyclerView触发空指针异常
错误详情
空指针异常触发在尝试为RecyclerView设置布局管理器的代码行,核心原因是recyclerView对象为null。
Fragment布局代码
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
Activity代码
package com.example.mymu import android.graphics.Color import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager.widget.ViewPager import com.example.my.MusicInfo import com.example.my.PageAdapter import kotlinx.android.synthetic.main.activity_main2.* class MainActivity2 : AppCompatActivity() { companion object { lateinit var mylist: MutableList<MusicInfo> } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main2) val song1= MusicInfo("Darshan Raval","Asal Main",R.drawable.asalmain,"3:10") val song2=MusicInfo("Jass Manak","Prada", R.drawable.manak,"2:50") val song3=MusicInfo("Darshan Raval","Asal Main",R.drawable.asalmain,"3:10") val song4=MusicInfo("Jass Manak","Prada",R.drawable.manak,"2:50") val song5=MusicInfo("Darshan Raval","Asal Main",R.drawable.asalmain,"3:10") val song6=MusicInfo("Jass Manak","Prada",R.drawable.manak,"2:50") val song7=MusicInfo("Darshan Raval","Asal Main",R.drawable.asalmain,"3:10") val song8=MusicInfo("Jass Manak","Prada",R.drawable.manak,"2:50") val song9=MusicInfo("Darshan Raval","Asal Main",R.drawable.asalmain,"3:10") val song10=MusicInfo("Jass Manak","Prada",R.drawable.manak,"2:50") val song11=MusicInfo("Darshan Raval","Asal Main",R.drawable.asalmain,"3:10") val song12=MusicInfo("Jass Manak","Prada",R.drawable.manak,"2:50") val song13=MusicInfo("Darshan Raval","Asal Main",R.drawable.asalmain,"3:10") val song14=MusicInfo("Jass Manak","Prada",R.drawable.manak,"2:50") val song15=MusicInfo("Darshan Raval","Asal Main",R.drawable.asalmain,"3:10") val song16=MusicInfo("Jass Manak","Prada",R.drawable.manak,"2:50") val song17=MusicInfo("Darshan Raval","Asal Main",R.drawable.asalmain,"3:10") val song18=MusicInfo("Jass Manak","Prada",R.drawable.manak,"2:50") val song19=MusicInfo("Darshan Raval","Asal Main",R.drawable.asalmain,"3:10") val song20=MusicInfo("Jass Manak","Prada",R.drawable.manak,"2:50") mylist= mutableListOf() mylist.add(song1) mylist.add(song2) mylist.add(song3) mylist.add(song4) mylist.add(song5) mylist.add(song6) mylist.add(song7) mylist.add(song8) mylist.add(song9) mylist.add(song10) mylist.add(song11) mylist.add(song12) mylist.add(song13) mylist.add(song14) mylist.add(song15) mylist.add(song16) mylist.add(song17) mylist.add(song18) mylist.add(song19) mylist.add(song20) // 报错代码段 val recyclerView=findViewById(R.id.rv) recyclerView.layoutManager = LinearLayoutManager(this@MainActivity2,LinearLayoutManager.VERTICAL,false) recyclerView.adapter = MyAdapter(mylist) view_pager.adapter=PageAdapter(supportFragmentManager) tab_layout.setupWithViewPager(view_pager) tab_layout.setTabTextColors(Color.parseColor("#7DC1C6"),resources.getColor(R.color.teal_700)) tab_layout.setBackgroundResource(R.drawable.drawable4) } }
问题原因
你在Activity中调用findViewById(R.id.rv),但这个RecyclerView是Fragment布局文件中的控件,Activity的布局里并没有这个ID,所以findViewById返回null,后续调用layoutManager方法直接触发空指针异常。
解决方案
将RecyclerView的初始化逻辑移到对应的Fragment中,在Fragment的onViewCreated方法中完成绑定:
class YourFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.your_fragment_layout, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val recyclerView = view.findViewById<RecyclerView>(R.id.rv) recyclerView.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) recyclerView.adapter = MyAdapter(MainActivity2.mylist) } }
同时,Activity中只保留ViewPager和TabLayout的初始化代码:
// Activity中修改后的代码段 view_pager.adapter=PageAdapter(supportFragmentManager) tab_layout.setupWithViewPager(view_pager) tab_layout.setTabTextColors(Color.parseColor("#7DC1C6"),resources.getColor(R.color.teal_700)) tab_layout.setBackgroundResource(R.drawable.drawable4)
内容的提问来源于stack exchange,提问作者jass manak FaN
相关产品推荐
相关产品推荐

