Kotlin中RecyclerView的使用

上一篇介绍了ListView中的使用基本流程,但是本文的RecyclerView更加的强大,可以实现比listview更多的功能。所以经过学习郭神的《第一行代码》的RecyclerView的这一部分,所以总结一下学习的成果,也为后面的使用准备一份借鉴的资料。

1准备好实体类

class News(var picture:Int,var name:String,var detail:String)

2准备好recyclerView的布局,用来设计自己想要的格式


<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


<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)
                }
        }
}

你可能感兴趣的:(Android,kotlin,android,java)