上一篇介绍了ListView中的使用基本流程,但是本文的RecyclerView更加的强大,可以实现比listview更多的功能。所以经过学习郭神的《第一行代码》的RecyclerView的这一部分,所以总结一下学习的成果,也为后面的使用准备一份借鉴的资料。
1准备好实体类
class News(var picture:Int,var name:String,var detail:String)
2准备好recyclerView的布局,用来设计自己想要的格式
<?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="100dp"
>
<ImageView
android:id="@+id/newPicture"
android:layout_width="100dp"
android:layout_height="100dp"
/>
<TextView
android:id="@+id/newsName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="20dp"
/>
<TextView
android:id="@+id/newDetail"
android:text="20dp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
</LinearLayout>
3准备好主布局,用来展示recyclerView
<?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"
android:background="@color/green"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30dp"
android:text="使用RecycleView实现列表"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycleViewItem"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
4继承并且重写适配器
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import com.mykotlintest.FruitAdapter
import com.mykotlintest.R
//相比于ArrayAdapter这里应该也是有几个参数的,只不过把参数给写到了方法里面,只留下一个数据传输即可
class NewsAdapter(var newsList:List<News> ) : RecyclerView.Adapter<NewsAdapter.ViewHolder>() {
//在内部类里面获取到item里面的组件
inner class ViewHolder(view:View):RecyclerView.ViewHolder(view){
var newPicture:ImageView=view.findViewById(R.id.newPicture)
var newName:TextView=view.findViewById(R.id.newsName)
var newDetail:TextView=view.findViewById(R.id.newDetail)
}
//重写的第一个方法,用来给制定加载那个类型的Recycler布局
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view=LayoutInflater.from(parent.context).inflate(R.layout.news_item_layout,parent,false)
var viewHolder=ViewHolder(view)
//单机事件
viewHolder.itemView.setOnClickListener {
var position= viewHolder.adapterPosition
var news=newsList[position]
Toast.makeText(parent.context,"你点击的新闻是${news.name}",Toast.LENGTH_SHORT).show()
}
viewHolder.newPicture.setOnClickListener {
var position=viewHolder.adapterPosition
var news=newsList[position]
Toast.makeText(parent.context,"你点击的图片是${news.name}",Toast.LENGTH_SHORT).show()
}
return viewHolder
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val news=newsList[position]
holder.newPicture.setImageResource(news.picture)
holder.newName.text=news.name
holder.newDetail.text=news.detail
}
override fun getItemCount(): Int {
return newsList.size
}
}
5在主布局中引入自定义的adapter
import android.os.Bundle
import android.os.PersistableBundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.mykotlintest.R
class NewsMainActivity : AppCompatActivity() {
private lateinit var newsList:ArrayList<News>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.news_main_activity)
//初始化参数
initNews()
var recyclerView=findViewById<RecyclerView>(R.id.recycleViewItem)
var layoutManager = LinearLayoutManager(this)
recyclerView.layoutManager=layoutManager
var adapter=NewsAdapter(newsList)
recyclerView.adapter=adapter
}
fun initNews(){
newsList= ArrayList()
for(i in 1..100){
var image=0
//仅仅是为了好区分
if(i%3==0){
image=R.drawable.ic_baseline_lock_24
}else if(i%3==1){
image=R.drawable.ic_baseline_person_24
}else{
image=R.drawable.ic_baseline_engineering_24
}
var name="新闻+${i}"
var details="内容是我是第${i}条新闻"
var news=News(image,name,details)
newsList.add(news)
}
}
}