RecyclerView学习之应用

  • 代码
  • RecyclerView.ViewHolder
  • RecyclerView.Adapater
    • getItemCount
    • getItemViewType
    • onCreateViewHolder
    • onBindViewHolder
  • RecyclerView应用
    • LinearLayoutManager
      • VERTICAL
      • HORIZONTAL
    • GridLayoutManager
    • StaggeredGridLayoutManager

学而不思则罔,思而不学则殆

相关文档:
RecyclerView学习(一)之应用
RecyclerView学习(二)之缓存探索
RecyclerView学习(三)之缓存原理分析
平时项目中使用RecyclerView机会特别多,列表展示是很好的工具,本篇文章就先来讲解一些使用心得,可能会不全,但是会慢慢增加他的使用方法

代码

https://github.com/aJanefish/RecyclerViewStudy

RecyclerView.ViewHolder

ViewHolder 是视图的载体,设计到数据绑定,视图展示,复用等功能

//用Kotlin实现    class TestHolder(itemView: View) : ViewHolder(itemView) {        //findViewById 获取View,在复用的时候就不用每次都去findView,增加开销        private val mTitle: TextView = itemView.findViewById(R.id.activity_study_one_item_tv)        //... 更多View        // 数据对象        private var mBean: Bean? = null              //绑定数据        fun onBind(bean: Bean?) {            if (bean == null) {                return            }            //数据操作,视图展示等            mBean = bean            mTitle.text = mBean?.mTitle ?: "我是小可爱"            mIndex.text = mBean?.index.toString() ?: "我是小可爱"            mDes.text = "$lastPosition -> $newPosition"            mImageView.setImageResource(mBean!!.imageId)            lastPosition = newPosition        }        init {        //对象初始化操作等        }    }

RecyclerView.Adapater

Adapater非常重要,是数据和RecyclerVeiw之间的桥梁,主要有几个方法比较重要
整体结构如下

class StudyOneAdapter(list: List<Bean?>) : RecyclerView.Adapter<StudyOneAdapter.TestHolder>() {    private val sTAG = "zy.StudyOneAdapter"    private var mList: List<Bean?> = mutableListOf<Bean?>()    init {        mList = list    }    //创建Holder    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TestHolder {...}    //绑定数据,如果有复用会直接返回复用的Holder    override fun onBindViewHolder(holder: TestHolder, position: Int) {...}    //返回数据个数,会根据这个生成视图    override fun getItemCount(): Int {...}    //返回ItemType,用来展示不同的是同一个RecyclerView,最常见的就是对话形式的展示    override fun getItemViewType(position: Int): Int {...}    class TestHolder(itemView: View) : ViewHolder(itemView) {...}    //数据类    class Bean(val index: Int, val imageId: Int, val mTitle: String, val itemType: Int = 0)}

getItemCount

返回数据个数,会根据这个生成视图

    override fun getItemCount(): Int {        return mList.size    }

getItemViewType

返回ItemType,用来展示不同的是同一个RecyclerView,最常见的就是对话形式的展示,一左一右两种不同的View

    //根据数据不同得到不同的type    override fun getItemViewType(position: Int): Int {        return mList[position]?.itemType ?: 0    }

onCreateViewHolder

创建Holder

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TestHolder {        Log.d(sTAG, "onCreateViewHolder")        mCreateNum++        val view = LayoutInflater.from(parent.context).inflate(R.layout.activity_study_one_item, parent, false)        when (viewType) {            0 -> return TestHolder1(view)            1 -> return TestHolder2(view)            else -> return TestHolder3(view)        }    }

onBindViewHolder

绑定数据,如果有复用会直接返回复用的Holder

    override fun onBindViewHolder(holder: TestHolder, position: Int) {        holder.onBind(mList[position])    }

RecyclerView应用

LinearLayoutManager

线性流展示

VERTICAL

val recyclerView = findViewById<RecyclerView>(R.id.test_rv)recyclerView.layoutManager = LinearLayoutManager(context) //默认是竖直视图+mReverseLayout = falserecyclerView.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)recyclerView.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, true) 

HORIZONTAL

val recyclerView = findViewById<RecyclerView>(R.id.test_rv)recyclerView.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)recyclerView.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, true)

GridLayoutManager

表格流视图

val recyclerView = findViewById<RecyclerView>(R.id.test_rv)recyclerView.layoutManager = GridLayoutManager(context, 3, GridLayoutManager.HORIZONTAL, false)recyclerView.layoutManager = GridLayoutManager(context, 3, GridLayoutManager.HORIZONTAL, true)recyclerView.layoutManager = GridLayoutManager(context, 3, GridLayoutManager.VERTICAL, false)recyclerView.layoutManager = GridLayoutManager(context, 3, GridLayoutManager.VERTICAL, true)

StaggeredGridLayoutManager

瀑布流视图

val recyclerView = findViewById<RecyclerView>(R.id.test_rv)recyclerView.layoutManager = StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.HORIZONTAL)recyclerView.layoutManager = StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL)

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. SharedPreferences使用
  3. WebView的使用
  4. Android实现点击切换视图并跳转传值
  5. AS:Android数据回传(简单实例源代码)
  6. Android使用AnysnTask强求数据
  7. android 可以控制速度的跑马灯
  8. android写入数据库、读取sqlite中的图片
  9. Android(安卓)view中invalidate方法学习小节

随机推荐

  1. Android 高仿微信头像截取 打造不一样的
  2. 学习android心里旅程
  3. Android(安卓)仿携程活动列表边框布局
  4. 实现类似android:clipChildren="false"的
  5. android中自定义Toast方法详解(一)
  6. 谁告诉你鸿蒙(HarmonyOS)不能在macOS下玩,一
  7. Android音频系统之音量控制详解(Android 5
  8. android ICS横竖屏定制及利用G-Sensor转
  9. Android AsyncTask异步线程
  10. 21、从头学Android之Android的数据存储--