使用前先编辑 build.gradle 导入 androidx.recyclerview.widget.RecyclerView

implementation "androidx.recyclerview:recyclerview:1.1.0"

导入成功后进入界面的 xml 使用,这边我还加了点其他的组件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    ………

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="5dp"
        android:layout_weight="1">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/search_list_movies"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FFF" />

    </LinearLayout>

</LinearLayout>

接下来创建,video_item.xml 文件,这个就是要展示的 item layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:paddingHorizontal="15dp"
    android:paddingVertical="10dp">

    <ImageView
        android:id="@+id/video_item_poster"
        android:layout_width="95dp"
        android:layout_height="130dp"
        android:background="#1000" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="10dp"
        android:orientation="vertical">

        <TextView
            android:id="@+id/video_item_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="流浪地球最终版"
            android:textColor="#000"
            android:textSize="17sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/video_item_tag"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:background="#6000"
            android:paddingHorizontal="8dp"
            android:paddingVertical="2dp"
            android:text="更新至06集"
            android:textColor="#FFF" />

        <TextView
            android:id="@+id/video_item_description"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:layout_weight="1"
            android:text="2019 / 中国大陆 / 科幻 冒险 灾难 / 吴京 吴京 吴京 吴京 吴京 吴京"
            android:textColor="#6000" />

        <TextView
            android:id="@+id/video_item_source"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:text="来源:逐梦影音"
            android:textColor="#A000" />


    </LinearLayout>

</LinearLayout>

先定义一个数据类 VideoItem.kt

data class VideoItem(
    val poster: String,
    val name: String,
    val description: String,
    val tag: String,
    val url: String,
    val source: String
)

接着我们可以开始创建 RecyclerView 的适配器了,这里创建了一个 VideoAdapter 继承至 RecyclerView.Adapter

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.zmide.video.R
import com.zmide.video.logic.model.VideoItem

// 视频项列表适配器
class VideoAdapter(val videoList: List<VideoItem>) :
    RecyclerView.Adapter<VideoAdapter.ViewHolder>() {

    // 组件控制器
    inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        // 视频海报 View
        val moviePoster: ImageView = view.findViewById(R.id.video_item_poster)

        // 视频名 View
        val movieName: TextView = view.findViewById(R.id.video_item_name)

        // 视频标签 View
        val movieTag: TextView = view.findViewById(R.id.video_item_tag)

        // 视频描述 View
        val movieDescription: TextView = view.findViewById(R.id.video_item_description)

        // 视频来源 View
        val movieSource: TextView = view.findViewById(R.id.video_item_source)
    }

    // 绑定视频列表项 Layout
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.video_item, parent, false)
        return ViewHolder(view)
    }

    // 返回视频列表项总个数
    override fun getItemCount() = videoList.size

    // 设置每个视频列表项数据
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        // 取出视频数据
        val movie = videoList[position]

        // TODO:设置海报
        // holder.moviePoster

        // 设置视频名
        holder.movieName.text = movie.name

        // 设置视频标签
        if (movie.tag !== "") {
            // 有标签,设置标签显示组件显示
            holder.movieTag.visibility = View.VISIBLE
            holder.movieTag.text = movie.tag
        } else {
            // 这个视频没有标签,设置标签组件隐藏
            holder.movieTag.visibility = View.GONE
        }

        // 设置视频描述
        holder.movieDescription.text = movie.description

        // 设置视频来源
        holder.movieSource.text = "来源:" + movie.source

    }
}

这里的 VideoAdapter 接收一个 videoList 的泛型 List ,继承至 VideoAdapter 泛型 VideoAdapter.ViewHolder(VideoAdapter.ViewHolder 是 VideoAdapter 中一个内部类)

实现了 3 个方法,分别是 onCreateViewHolder 用于绑定列表项 Layout,getItemCount 用于 返回列表项总个数,onBindViewHolder 用于设置每个列表项数据

接着在 Activity 中使用设置 RecyclerView

import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import com.zmide.video.BaseApplication
import com.zmide.video.R
import com.zmide.video.logic.model.VideoItem
import kotlinx.android.synthetic.main.activity_search.*

class SearchActivity : AppCompatActivity() {

    companion object {

        fun actionStart() {
            actionStart("")
        }

        fun actionStart(keyword: String) {
            val context = BaseApplication.context
            val intent = Intent().setClass(context, SearchActivity::class.java)
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            if (keyword !== "") intent.putExtra("keyword", keyword)
            context.startActivity(intent)
        }
    }

    private val videoList = ArrayList<VideoItem>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_search)
        val keyword = intent.getStringExtra("keyword")
        if (keyword !== null) {
            // 存在关键词操作
            Log.d("开始搜索", keyword)
        }

        initVideoList() // 初始化视频数据
        val layoutManager = LinearLayoutManager(this)
        search_list_movies.layoutManager = layoutManager
        val adapter = VideoAdapter(videoList)
        search_list_movies.adapter = adapter

    }

    private fun initVideoList() {
        repeat(6) {
            videoList.add(
                VideoItem(
                    "",
                    "流浪地球",
                    "2019 / 中国大陆 / 科幻 冒险 灾难 / 吴京 吴京 吴京 吴京 吴京 吴京",
                    "电影",
                    "",
                    "逐梦视频"
                )
            )
            videoList.add(
                VideoItem(
                    "",
                    "流浪地球",
                    "2019 / 中国大陆 / 科幻 冒险 灾难 / 吴京 吴京 吴京 吴京 吴京 吴京",
                    "",
                    "",
                    "逐梦视频"
                )
            )
        }
    }

}

最终实现效果如下

【笔记】Kotlin Android 开发使用 RecyclerView-天真的小窝