当前位置:网站首页>Efficient use of RecyclerView Section 1
Efficient use of RecyclerView Section 1
2022-07-31 14:56:00 【[email protected]】
List-related layouts are the most integral part of the development process,And mastering some efficient skills can help us improve development efficiency at the same time,还能优化代码,Reduce redundancy andbug的产生.
1.listitem实时预览
在UI绘制时,Detail and style adjustments are unavoidable,If every adjustment goesrunCheck the effect later,inefficiency,使用listitem,operation can be avoided,直接使用AndroidStudioBuilt-in preview function for debugging
例如
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/rv_student" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" tools:listitem="@layout/item_study" tools:context=".one.StudentActivity" />
效果如下:
2,xml中设置layoutManager
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/rv_student" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" tools:listitem="@layout/item_study" android:orientation="vertical" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" tools:context=".one.StudentActivity" />
It can be set directly in the layout codeLayoutManagertype and some related properties,例如方向,The number of each row in grid layout, etc.
3,Use the default dividing line
You can use the default split line style provided by the official,Reduce duplicate creation.
//添加默认的分割线
rv_student.addItemDecoration(DividerItemDecoration(this,
(rv_student.layoutManager as LinearLayoutManager).orientation))
For personalization,need to base itself onItemDecoration进行定制
4,添加Item点击事件
使用Kotlin函数式的思想,Quickly add click events
1)在Adapteradd parameters to the constructor
class StudentAdapter(private val data:ArrayList<StudentInfo>,
private val itemClick:(StudentInfo) ->Unit):
RecyclerView.Adapter<StudentAdapter.ViewHolder>() {
}
2)初始化AdapterWhen passing in the click function
//学生数据列表
private val studentEntities = ArrayList<StudentInfo>()
//适配器
private val studentAdapter by lazy {
StudentAdapter(studentEntities,this::onStudentItemClick)
}
/**
*点击事件
*/
private fun onStudentItemClick(entity:StudentInfo){
/**
* 点击Item时,Get the user information of the current click
*/
Log.d(TAG,"onStudentItemClick()--->$entity")
Toast.makeText(this,"$entity",Toast.LENGTH_LONG).show()
}
3)使用时
itemView.setOnClickListener { itemClick(entity) }
5,Adapter中获取上下文
在onCreateViewHolder中获取context对象,Reduce the number of parameters passed during construction
//定义上下文
private lateinit var context:Context
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
context = parent.context
}
The code that completes the above function is as follows:
1,item布局
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="16dp" xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.appcompat.widget.AppCompatImageView android:id="@+id/iv_icon" android:layout_width="48dp" app:layout_constraintLeft_toLeftOf="parent" android:src="@mipmap/ic_launcher" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:layout_height="48dp"/>
<TextView app:layout_constraintTop_toTopOf="parent" app:layout_constraintLeft_toRightOf="@+id/iv_icon" android:layout_width="wrap_content" android:id="@+id/tv_title" android:gravity="center" android:text="Study" android:textSize="22sp" android:layout_marginLeft="16dp" app:layout_constraintVertical_chainStyle="packed" app:layout_constraintBottom_toTopOf="@+id/tv_second" android:textColor="@android:color/black" android:layout_height="wrap_content"/>
<TextView android:id="@+id/tv_subtitle" android:layout_width="wrap_content" app:layout_constraintLeft_toRightOf="@+id/iv_icon" app:layout_constraintTop_toBottomOf="@+id/tv_study" android:textSize="16sp" android:layout_marginLeft="16dp" app:layout_constraintVertical_chainStyle="packed" android:text="zhansan" android:textColor="@color/cardview_dark_background" app:layout_constraintBottom_toBottomOf="parent" android:layout_height="wrap_content"/>
<TextView android:id="@+id/tv_gender" android:layout_width="wrap_content" android:textSize="18sp" android:text="男" android:textColor="@color/material_on_surface_emphasis_high_type" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>
2,Activity布局
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/rv_student" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" tools:listitem="@layout/item_study" android:orientation="vertical" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" tools:context=".one.StudentActivity" />
3,Activity代码
package com.example.recyclerviewstudy.one
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.recyclerviewstudy.R
import com.example.recyclerviewstudy.StudentInfo
class StudentActivity : AppCompatActivity() {
companion object{
val TAG = this::class.simpleName
}
//学生数据列表
private val studentEntities = ArrayList<StudentInfo>()
//适配器
private val studentAdapter by lazy {
StudentAdapter(studentEntities,this::onStudentItemClick)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_study)
initRecyclerView()
}
private fun initRecyclerView(){
val rv_student = findViewById<RecyclerView>(R.id.rv_student)
//添加默认的分割线
rv_student.addItemDecoration(DividerItemDecoration(this,
(rv_student.layoutManager as LinearLayoutManager).orientation))
rv_student.adapter = studentAdapter
produceData()
}
private fun onStudentItemClick(entity:StudentInfo){
/**
* 点击Item时,Get the user information of the current click
*/
Log.d(TAG,"onStudentItemClick()--->$entity")
Toast.makeText(this,"$entity",Toast.LENGTH_LONG).show()
}
//生产数据
private fun produceData(){
for (i in 0..20){
studentEntities.add(StudentInfo("zhang san $i",i,if (i%2==0)"男" else "女"))
}
}
}
4,Adapter完整代码
package com.example.recyclerviewstudy.one
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.recyclerviewstudy.R
import com.example.recyclerviewstudy.StudentInfo
class StudentAdapter(private val data:ArrayList<StudentInfo>,
private val itemClick:(StudentInfo) ->Unit):
RecyclerView.Adapter<StudentAdapter.ViewHolder>() {
//定义上下文
private lateinit var context:Context
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
context = parent.context
return ViewHolder(LayoutInflater.from(context)
.inflate(R.layout.item_study,parent,false),itemClick)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(data[position])
}
override fun getItemCount() = data.size
inner class ViewHolder(itemView:View,val itemClick:(StudentInfo) -> Unit):RecyclerView.ViewHolder(itemView){
val tv_name:TextView = itemView.findViewById(R.id.tv_title)
val tv_age:TextView = itemView.findViewById(R.id.tv_subtitle)
val tv_gender:TextView = itemView.findViewById(R.id.tv_gender)
private lateinit var entity:StudentInfo
init {
itemView.setOnClickListener { itemClick(entity) }
}
fun bind(entity:StudentInfo){
this.entity = entity
entity.apply {
tv_name.text = name
tv_age.text = "$age"
tv_gender.text = gander
}
}
}
}
针对RecyclerViewThis is what has been learned so far in relation to practical use,The specific practice also needs to be optimized and implemented in combination with its own project structure.
RecyclerViewis essential for development,Although its features and performance compare toListViewThere have been great improvements and enhancements,However, there are still some performance problems when used improperly,And there is still room for further optimization,结合mCacheViewExtension和DiffUtil的实现,让你的UI更加流畅.
版权声明
本文为[[email protected]]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/212/202207311451011633.html
边栏推荐
- RecyclerView高效使用第三节
- Jmeter常用的十大组件
- 《微信小程序-进阶篇》Lin-ui组件库源码分析-Icon组件
- 435. 无重叠区间
- Architecture actual combat battalion module 8 message queue table structure design
- Redis与分布式:主从复制
- NC | 斯坦福申小涛等开发数据可重复分析计算框架TidyMass
- In the future, the interviewer asks you why it is not recommended to use Select *, please answer him out loud!
- Motion capture system for end-positioning control of flexible manipulators
- Nuget package and upload tutorial
猜你喜欢

Small test knife: Go reflection helped me convert Excel to Struct

乡村基冲刺港交所:5个月期内亏2224万 SIG与红杉中国是股东

Word表格转到Excel中

我把问烂了的MySQL面试题总结了一下

sentinel与nacos持久化

Asynchronous processing business using CompletableFuture

Jmeter常用的十大组件

LeetCode二叉树系列——222.完全二叉树的节点个数

MySQL 23 classic interviews hang the interviewer

Message queue data storage MySQL table design
随机推荐
Sentinel热点参数限流
[QNX Hypervisor 2.2 User Manual] 9.13 rom
Message queue data storage MySQL table design
RecyclerView高效使用第三节
四象限时间管理有多好用?
谷歌CTS测试(cta测试)
763.划分字母区间——之打开新世界
leetcode303场周赛复盘
Motion capture system for end-positioning control of flexible manipulators
Analysis of the startup source code of hyperf (2) - how the request reaches the controller
Five dimensions to start MySQL optimization
分成两栏后文字顺序混乱的问题解决【写期刊论文时】
Web自动化实战——Selenium4(自动化测试环境的搭建)
Unity Shader入门精要学习——透明效果
OpenCV测量物体的尺寸技能 get~
LeetCode二叉树系列——222.完全二叉树的节点个数
力扣:738.单调递增的数字
2021 OWASP TOP 10 漏洞指南
Recommendation System - Recall Phase - 2013: DSSM (Twin Towers Model) [Embedding (Semantic Vector) Recall] [Microsoft]
华医网冲刺港股:5个月亏2976万 红杉与姚文彬是股东