碎片中的Android Kotlin RecyclerView不工作
我对Kotlin和Android编程非常陌生。我试图创建一个填充回收器视图的片段,但不知怎的,我得到了以下错误:碎片中的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
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
}
谢谢,现在工作正常。谢谢,现在工作正常。