Listview 带有Kotlin的RecyclerView未垂直布置单元
我的列表仅显示一行数据,即使预期的4行通过Listview 带有Kotlin的RecyclerView未垂直布置单元,listview,android-recyclerview,kotlin,Listview,Android Recyclerview,Kotlin,我的列表仅显示一行数据,即使预期的4行通过ViewHolder RecyclerView,RecyclerView.Adapter,以及RecyclerView.ViewHolder都能正常工作。我看到正确的4行数据通过bind函数。但是,我在列表中只看到一行。这就好像LinearLayoutManager没有在垂直方向上正确布局单元格一样。我不确定错过了什么 class SongListFragment : Fragment() { private lateinit var media
ViewHolder
RecyclerView
,RecyclerView.Adapter
,以及RecyclerView.ViewHolder
都能正常工作。我看到正确的4行数据通过bind函数。但是,我在列表中只看到一行。这就好像LinearLayoutManager
没有在垂直方向上正确布局单元格一样。我不确定错过了什么
class SongListFragment : Fragment() {
private lateinit var mediaProvider:MediaProvider
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mediaProvider = MediaLibraryTestSongProvider()
}
override fun onCreateView(inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?): View? {
//TODO: how to inflate fragment using Kotlin extension?
val songListView = inflater.inflate(R.layout.fragment_song_list, container, false)
val songListRecyclerView = songListView.songListRecyclerView
songListRecyclerView.layoutManager = LinearLayoutManager( activity )
songListRecyclerView.adapter = SongListCellAdapter(mediaProvider.getSongs() )
return songListView
}
private inner class SongListCellAdapter(val songList:List<Song>) : RecyclerView.Adapter<SongListCellHolder>()
{
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) : SongListCellHolder {
val inflater = LayoutInflater.from( activity )
val songCellView = inflater.inflate(R.layout.cell_song_list,parent,false)
val holder = SongListCellHolder( songCellView )
return holder
}
override fun onBindViewHolder(holder: SongListCellHolder, position: Int) {
holder.bind(songList[position])
}
override fun getItemCount(): Int {
return songList.size
}
}
private inner class SongListCellHolder(itemView:View) : RecyclerView.ViewHolder(itemView)
{
fun bind( song:Song ) = with(itemView) {
songTitle.text = song.title
songArtist.text = song.artist
}
}
}
class-SongListFragment:Fragment(){
私有lateinit var mediaProvider:mediaProvider
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
mediaProvider=MediaLibraryTestSongProvider()
}
override fun onCreateView(充气机:布局充气机,
容器:视图组?,
savedInstanceState:捆绑?:查看{
//TODO:如何使用Kotlin extension膨胀碎片?
val songListView=充气机。充气(R.layout.fragment\u song\u列表,容器,false)
val songListRecyclerView=songListView.songListRecyclerView
songListRecyclerView.layoutManager=LinearLayoutManager(活动)
songListRecyclerView.adapter=SongListCellAdapter(mediaProvider.getSongs())
返回歌曲列表视图
}
私有内部类SongListCellAdapter(val songList:List):RecyclerView.Adapter()
{
override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):SongListCellHolder{
val充气机=充气机从(活动)
val songCellView=充气机。充气(R.layout.cell_song_列表,父项,false)
val holder=SongListCellHolder(songCellView)
报税表持有人
}
覆盖BindViewHolder(holder:SongListCellHolder,位置:Int){
持有者绑定(歌曲列表[位置])
}
重写getItemCount():Int{
return songList.size
}
}
私有内部类SongListCellHolder(itemView:View):RecyclerView.ViewHolder(itemView)
{
趣味绑定(歌曲:歌曲)=与(项目视图){
songTitle.text=song.title
songArtist.text=song.artist
}
}
}
问题很简单(一旦你知道答案)。我的单元格布局,cell\u song\u list
具有layout\u height=“match\u content”
,这导致每个单元格都是屏幕的大小。其他人在那里,但在屏幕外,在模拟器上,我没有滚动到注意到
作为记录,这里是我对单元格的更正布局,顶层的LinearLayout
使用layout\u height=“wrap\u content”
,因此单元格大小正确
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/songTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
tools:text="Title" />
<TextView
android:id="@+id/songArtist"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Artist"
android:textAppearance="@style/TextAppearance.AppCompat.Caption" />
</LinearLayout>
是的,这是Kotlin扩展的语法。它取代了普通的findViewById()调用,这是一个非常常见的错误。