使用前先编辑 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 / 中国大陆 / 科幻 冒险 灾难 / 吴京 吴京 吴京 吴京 吴京 吴京",
"",
"",
"逐梦视频"
)
)
}
}
}
最终实现效果如下