Android之recyclerView

一、概念

RecyclerView 是 Android 提供的一种高级组件,用于在屏幕上展示大量数据(如列表或瀑布流布局)的视图。

recycleview其实是一种容器,显示所有的内容和交互

会事先预加载一屏,提高了效率

注意:上面三个视图是预加载好的,三个外的视图就放在重复队列

二、特点:

  1. 高效复用视图RecyclerView 通过视图持有者模式(ViewHolder Pattern)来复用子项视图,减少了内存消耗和资源使用,提高了滚动性能。

  2. 灵活的布局管理:使用 LayoutManager 接口,可以轻松地实现不同类型的布局(如线性布局、网格布局、瀑布流布局等)。

  3. 动画支持RecyclerView 提供了内置的动画系统,可以轻松添加增加、删除和移动项时的动画效果。

  4. 数据变化监听:它能够高效处理数据集的更改,并自动更新显示的内容,使用 Adapter 来管理数据与视图之间的绑定

三、使用场景:

1. 列表展示

`RecyclerView` 最常见的用途是展示列表数据,比如联系人列表、消息列表、商品列表等。它能够高效地处理大量数据项,并支持滚动。

 2. 网格布局

当需要以网格形式展示数据时,`RecyclerView` 可以通过 `GridLayoutManager` 实现。例如,图片库、商品展示等场景。

3. 瀑布流布局

使用 `StaggeredGridLayoutManager`,`RecyclerView` 可以实现瀑布流效果,适合展示不规则大小的内容,如 Pinterest 风格的图片墙。

 4. 动态数据更新

`RecyclerView` 支持动态更新数据集,可以在不重建整个列表的情况下,添加、删除或修改数据项。这使得它非常适合需要频繁更新的场景,如聊天应用。

 5. 分组列表

通过自定义适配器和视图类型,`RecyclerView` 可以实现分组列表的效果,例如分类商品、分组联系人等。

6. 自定义视图

`RecyclerView` 可以创建自定义的视图项,适合需要复杂布局的场景,比如带有图片、文本和按钮的复杂列表项。

7. 支持多种交互

`RecyclerView` 支持多种用户交互,如拖拽、滑动删除等,适合需要用户交互的场景。

四、使用步骤

在这里item样式的种类有所不同的话用法上也会有一些差别

1、只有一种样式

1、添加依赖

implementation 'androidx.recyclerview:recyclerview:1.2.1' // 或者最新版本

2、创建recycleview对象

在xml中创建是最方便的,除此之外也可以用代码创建

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:layout_marginTop="100dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="1.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

3、配置recyclerView

在fragment里配置recyclerView,及其布局方式

4、创建adapter管理recyclerview,以及创建一个内部类viewHolder

创建adapter管理recyclerview,以及创建一个viewHolder持有一个view(viewHolder是重复的)(这是大概的框架)

5、创建数据源

 6、在adapter里设置数据源

7、创建一个样式,确定每一个item的样式

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"

    >

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="270dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:scaleType="fitCenter"
        app:srcCompat="@drawable/ic_launcher_background" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:text="刘德华"
        android:textSize="20sp"
        app:layout_constraintStart_toEndOf="@+id/imageView"
        app:layout_constraintTop_toTopOf="@+id/imageView" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="19dp"
        android:layout_marginTop="19dp"
        android:text="你好,我是刘德华"
        app:layout_constraintStart_toEndOf="@+id/imageView"
        app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>

 

8、再在viewHolder里面解析出来,

9、配置item个数

10、在viewHolder这里配置一些item具体的数据

注意这里的是持有一个view且这个模板是重复利用的

 11、绑定数据,告诉每一个viewHolder该显示什么内容

 

12、配置适配器(adapter)以及一些数据源

13、具体代码

fragment里的

package com.example.littlepainter.home

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.PagerSnapHelper
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.example.littlepainter.R

class HomeFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_home, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        //配置recyclerView
        val recyclerView = view.findViewById<RecyclerView>(R.id.recyclerView)
        //配置布局方式
        recyclerView.layoutManager = LinearLayoutManager(
            requireContext(),//可选的
            RecyclerView.VERTICAL,//Horizontal纵向和横向分布
            false//是否需要反过来布局
        )
        //按页显示
       // PagerSnapHelper().attachToRecyclerView(recyclerView)
        //配置适配器
        val mAdapter = QQAdapter()
        //val mAdapter = ContactAdapter()
        recyclerView.adapter = mAdapter
        //配置数据源
        mAdapter.setData(listOf(

            Friend(R.drawable.f1,"Jack",""),
            Friend(R.drawable.baseline_language_24,"Rouse",""),
            Friend(R.drawable.baseline_language_24,"Lily",""),
            Friend(R.drawable.baseline_language_24,"Marry",""),
           
            Friend(R.drawable.baseline_language_24,"Jack",""),
            Friend(R.drawable.baseline_language_24,"Rouse",""),
            Friend(R.drawable.baseline_language_24,"Lily",""),
            Friend(R.drawable.baseline_language_24,"Marry",""),
            ))
    }

}

adapter

package com.example.littlepainter.home

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.core.graphics.drawable.toDrawable
import androidx.recyclerview.widget.RecyclerView
import com.example.littlepainter.R


/**创建adapter管理recyclerview显示的子视图item*/
class QQAdapter:RecyclerView.Adapter<QQAdapter.MyViewHolder>() {
    private var mFriends = emptyList<Friend>()
    /**创建一个viewHolder 确定每个item的样式*/
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        //解析layout资源
        val layoutInflater = LayoutInflater.from(parent.context)
        var view = layoutInflater.inflate(R.layout.layout_qq_item,parent,false)
        return MyViewHolder(view)
    }

    /**配置item个数*/
    override fun getItemCount(): Int {
        return mFriends.size
    }

    /**绑定数据,告诉每一个viewHolder该显示什么内容*/
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        //取出position对应的数据源 拿给view Holder去显示
        holder.bind(mFriends[position])
    }

    /**外部设置数据源*/
    fun setData(friends:List<Friend>){
        mFriends = friends
    }

    /**创建一个viewHolder,持有一个view(重复利用的是viewHolder)*/
    class MyViewHolder(view:View): RecyclerView.ViewHolder(view) {
        fun bind(mode:Friend){
            val iconImageView = itemView.findViewById<ImageView>(R.id.imageView)
            val nameTextView = itemView.findViewById<TextView>(R.id.textView)
            iconImageView.setImageDrawable(mode.view.toDrawable())
            nameTextView.text = mode.name
        }
    }


}

2、多种样式(以两个为例)

 如果是有不同的样式,则建立多个viewHolder(有几种样式就建立个),其他的和以上一个的都差不多 

 1、建立Adapter 

管理recyclerview(大致框架是这样的)和一个的基本没什么区别

注意

class ContactAdapter:RecyclerView.Adapter<RecyclerView.ViewHolder>()这里的类型有点区别当个的是具体的内部类的名称,多个则是RecyclerView.ViewHolder

2、建立内部类viewHolder

例如这里弄了两个样式,就建立两个viewHolder

 

3、定义外部数据源以及在adapter里设置数据源

 在adapter里设置数据源

 

4、创建一个样式,确定每一个item的样式

 

 5、根据数据源配置当前这个item应该是哪种关系类型的view

6、在onCreateViewHolder中解析出每种样式

根据viewType创建对应的viewHolder对象并将对应的样式解析出来

 

7、配置item的个数

这个是一样的

 8、绑定数据,告诉每一个viewHolder该显示什么内容 

 

9、根据不同类型,绑定不同数据

 

10、在回到fragment中来配置适配器以及数据源

具体代码:

package com.example.littlepainter.home

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.PagerSnapHelper
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.example.littlepainter.R


class HomeFragment : Fragment() {


    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_home, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        //配置recyclerView
        val recyclerView = view.findViewById<RecyclerView>(R.id.recyclerView)
        //配置布局方式
        recyclerView.layoutManager = LinearLayoutManager(
            requireContext(),//可选的
            RecyclerView.VERTICAL,//Horizontal纵向和横向分布
            false//是否需要反过来布局
        )
        //按页显示
       // PagerSnapHelper().attachToRecyclerView(recyclerView)
        //配置适配器
        //val mAdapter = QQAdapter()
        val mAdapter = ContactAdapter()
        recyclerView.adapter = mAdapter
        //配置数据源
        mAdapter.setData(listOf(
            Friend(isFriend = true, title = "同班同学"),
            Friend(R.drawable.f1,"Jack",""),
            Friend(R.drawable.baseline_language_24,"Rouse",""),
            Friend(R.drawable.baseline_language_24,"Lily",""),
            Friend(R.drawable.baseline_language_24,"Marry",""),
            Friend(isFriend =  true, title = "大学同学"),
            Friend(R.drawable.baseline_language_24,"Jack",""),
            Friend(R.drawable.baseline_language_24,"Rouse",""),
            Friend(R.drawable.baseline_language_24,"Lily",""),
            Friend(R.drawable.baseline_language_24,"Marry",""),
            ))
    }

}
package com.example.littlepainter.home

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.core.graphics.drawable.toDrawable
import androidx.recyclerview.widget.RecyclerView
import com.example.littlepainter.R

class ContactAdapter:RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    private var mFriend = emptyList<Friend>()
    private val TYPE_NORMAL = 0 //定义类型
    private val TYPE_TILE = 1
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val inflter = LayoutInflater.from(parent.context)//创建解析器
        return if(viewType == TYPE_NORMAL){//根据viewType创建对应的viewHolder对象
            FriendViewHolder(inflter.inflate(R.layout.layout_qq_item,parent,false))
        }else{
            SecondViewHolder(inflter.inflate(R.layout.layout_select_item,parent,false))
        }
    }
    override fun getItemCount(): Int {
        return mFriend.size
    }
    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        if(mFriend[position].title == "组名"){
            (holder as FriendViewHolder).bind(mFriend[position])
        }else{
            (holder as SecondViewHolder).bind(mFriend[position])
        }
    }
    //根据数据源配置当前这个item应该是哪种关系类型的view
    override fun getItemViewType(position: Int): Int {
        val model = mFriend[position]
        return if(model.title == "组名" ) TYPE_NORMAL else TYPE_TILE
    }
    fun setData(friends: List<Friend>) {
        mFriend = friends
    }
    class FriendViewHolder(view:View):RecyclerView.ViewHolder(view){
        fun bind(mode:Friend){
            val iconImageView = itemView.findViewById<ImageView>(R.id.imageView)
            val text = itemView.findViewById<TextView>(R.id.textView)
            iconImageView.setImageDrawable(mode.view.toDrawable())
            text.text = mode.name
        }
    }
    class SecondViewHolder(view:View):RecyclerView.ViewHolder(view){
        fun bind(mode:Friend){
            val titleTextView = itemView.findViewById<TextView>(R.id.textView3)
            titleTextView.text = mode.title
        }
    }
}
package com.example.littlepainter.home

import android.view.View

data class Friend(
    val view: Int = 0, val name:String = "",
    val content:String = "",val isFriend:Boolean = true,
    val title:String = "组名"
    )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值