碎片中的Android Kotlin RecyclerView不工作

碎片中的Android Kotlin RecyclerView不工作,android,kotlin,android-fragments,android-recyclerview,Android,Kotlin,Android Fragments,Android Recyclerview,我对Kotlin和Android编程非常陌生。我试图创建一个填充回收器视图的片段,但不知怎的,我得到了以下错误:E/RecyclerView:没有连接适配器;跳过布局 我真的不明白为什么我会得到这个,因为我把所有的东西都装订好了。如果有人能解释我做错了什么,我会非常感激。我的代码如下: 我的班级: data class Movie(val id:Int, val posterPath:String, val vote:Double, val language:String,val release

我对Kotlin和Android编程非常陌生。我试图创建一个填充回收器视图的片段,但不知怎的,我得到了以下错误:
E/RecyclerView:没有连接适配器;跳过布局
我真的不明白为什么我会得到这个,因为我把所有的东西都装订好了。如果有人能解释我做错了什么,我会非常感激。我的代码如下:

我的班级:

data class Movie(val id:Int, val posterPath:String, val vote:Double, val language:String,val releaseDate:String, val title:String) {}
我的片段:

class MovelistScreen : Fragment(R.layout.fragment_movelist_screen) {

    @ExperimentalStdlibApi
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

// View created, can be accessed
//        val args = arguments ?: throw IllegalArgumentException("Use new instance method")
//        val argValue = args.getString(ARG_NAME)

        val binding = FragmentMovelistScreenBinding.inflate(layoutInflater)
        val lst : List<Movie> = buildList {
            add(Movie(id=1,posterPath="/asdasd",vote=7.3,language="Eng",releaseDate="2017",title="Test1"))
            add(Movie(id=2,posterPath="/asdasd",vote=6.3,language="Hun",releaseDate="2013",title="Test2"))
        }

        val listAdapter = MovieListAdapter()
        binding.itemList.adapter=listAdapter
        listAdapter.submitList(lst)
    }
    companion object {
        private const val ARG_NAME = "test_argument"
        fun newInstance(testArg: String): DetailpageFragment = DetailpageFragment().apply {
            arguments = Bundle().apply { putString(ARG_NAME, testArg) }
        }
    }
}
class-MovelistScreen:Fragment(R.layout.Fragment\u-movelist\u-screen){
@实验TDlibAPI
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
//视图已创建,可以访问
//val args=arguments?:抛出IllegalArgumentException(“使用新实例方法”)
//val argValue=args.getString(ARG_名称)
val绑定=碎片移动列表屏幕绑定。充气(拉平)
val lst:List=buildList{
添加(电影(id=1,posterPath=“/asdasd”,vote=7.3,language=“Eng”,releaseDate=“2017”,title=“Test1”))
添加(电影(id=2,posterPath=“/asdasd”,vote=6.3,language=“Hun”,releaseDate=“2013”,title=“Test2”))
}
val listAdapter=MovieListAdapter()
binding.itemList.adapter=listAdapter
listAdapter.submitList(lst)
}
伴星{
private const val ARG_NAME=“测试参数”
有趣的newInstance(testArg:String):DetailpageFragment=DetailpageFragment().apply{
arguments=Bundle().apply{putString(ARG_NAME,testArg)}
}
}
}
我的适配器

class MovieListAdapter : ListAdapter<Movie, MovieViewHolder>(diffUtil) {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MovieViewHolder {
        val layoutInflater: LayoutInflater = LayoutInflater.from(parent.context)
        return MovieViewHolder(MovieItemBinding.inflate(layoutInflater,parent,false))
    }

    override fun onBindViewHolder(holder: MovieViewHolder, position: Int) {
        val item:Movie=getItem(position)
        val binding:MovieItemBinding = holder.binding

        binding.movieTitle.text=item.title
        binding.releaseYear.text=item.releaseDate
        binding.language.text=item.language
        binding.ratingtext.text=item.vote.toString()
        binding.movieImage.load("https://i.postimg.cc/VLbN4hkz/the-hobbit-the-desolation-of-smaug.jpg")
    }
}


private val diffUtil : DiffUtil.ItemCallback<Movie> = object : DiffUtil.ItemCallback<Movie>() {
    override fun areItemsTheSame(oldItem: Movie, newItem: Movie): Boolean = oldItem.id == newItem.id
    override fun areContentsTheSame(oldItem: Movie, newItem: Movie): Boolean = oldItem == newItem
}

class MovieViewHolder(val binding: MovieItemBinding):RecyclerView.ViewHolder(binding.root)
class MovieListAdapter:ListAdapter(diffUtil){
重写CreateViewHolder(父级:ViewGroup,viewType:Int):MovieViewHolder{
val layoutInflater:layoutInflater=layoutInflater.from(parent.context)
返回MovieViewHolder(MovieItemBinding.充气(LayoutFlater、parent、false))
}
覆盖BindViewHolder(holder:MovieViewHolder,位置:Int){
val item:Movie=getItem(位置)
val绑定:MovieItemBinding=holder.binding
binding.movieTitle.text=item.title
binding.releaseYear.text=item.releaseDate
binding.language.text=item.language
binding.ratingtext.text=item.vote.toString()
binding.movieImage.load(“https://i.postimg.cc/VLbN4hkz/the-hobbit-the-desolation-of-smaug.jpg")
}
}
private val diffUtil:diffUtil.ItemCallback=object:diffUtil.ItemCallback(){
覆盖有趣的项目相同(oldItem:Movie,newItem:Movie):布尔=oldItem.id==newItem.id
覆盖有趣的内容相同(oldItem:Movie,newItem:Movie):布尔=oldItem==newItem
}
类MovieViewHolder(val绑定:MovieItemBinding):RecyclerView.ViewHolder(binding.root)
fragment_movelist_screen.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/item_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        android:orientation="vertical"
        android:padding="16dp">
    </androidx.recyclerview.widget.RecyclerView>

</androidx.constraintlayout.widget.ConstraintLayout>

mainactivity.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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">

    <fragment
        android:id="@+id/fragmentmovielist"
        android:name="com.example.ubbassignment2.MovelistScreen"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout="@layout/fragment_detailpage" />
</FrameLayout>

您正在
onViewCreated
中创建一个新视图并进行绑定,并将适配器设置为该视图(该视图将被垃圾收集)。您应该在
onCreateView
中膨胀视图,并将适配器设置为该回收器视图,而不是临时视图

片段:

override fun onCreateView(...): View {
    val binding = FragmentMovelistScreenBinding.inflate(layoutInflater)
    val lst : List<Movie> = buildList {
        add(Movie(id=1,posterPath="/asdasd",vote=7.3,language="Eng",releaseDate="2017",title="Test1"))
        add(Movie(id=2,posterPath="/asdasd",vote=6.3,language="Hun",releaseDate="2013",title="Test2"))
    }

    val listAdapter = MovieListAdapter()
    binding.itemList.adapter=listAdapter
    listAdapter.submitList(lst)
  
    return binding.root
}
override fun onCreateView(…):视图{
val绑定=碎片移动列表屏幕绑定。充气(拉平)
val lst:List=buildList{
添加(电影(id=1,posterPath=“/asdasd”,vote=7.3,language=“Eng”,releaseDate=“2017”,title=“Test1”))
添加(电影(id=2,posterPath=“/asdasd”,vote=6.3,language=“Hun”,releaseDate=“2013”,title=“Test2”))
}
val listAdapter=MovieListAdapter()
binding.itemList.adapter=listAdapter
listAdapter.submitList(lst)
返回binding.root
}

您正在
onViewCreated
中创建一个新视图并进行绑定,并将适配器设置为该视图(该视图将被垃圾收集)。您应该在
onCreateView
中膨胀视图,并将适配器设置为该回收器视图,而不是临时视图

片段:

override fun onCreateView(...): View {
    val binding = FragmentMovelistScreenBinding.inflate(layoutInflater)
    val lst : List<Movie> = buildList {
        add(Movie(id=1,posterPath="/asdasd",vote=7.3,language="Eng",releaseDate="2017",title="Test1"))
        add(Movie(id=2,posterPath="/asdasd",vote=6.3,language="Hun",releaseDate="2013",title="Test2"))
    }

    val listAdapter = MovieListAdapter()
    binding.itemList.adapter=listAdapter
    listAdapter.submitList(lst)
  
    return binding.root
}
override fun onCreateView(…):视图{
val绑定=碎片移动列表屏幕绑定。充气(拉平)
val lst:List=buildList{
添加(电影(id=1,posterPath=“/asdasd”,vote=7.3,language=“Eng”,releaseDate=“2017”,title=“Test1”))
添加(电影(id=2,posterPath=“/asdasd”,vote=6.3,language=“Hun”,releaseDate=“2013”,title=“Test2”))
}
val listAdapter=MovieListAdapter()
binding.itemList.adapter=listAdapter
listAdapter.submitList(lst)
返回binding.root
}

谢谢,现在工作正常。谢谢,现在工作正常。