当前位置:网站首页>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
边栏推荐
- 乡村基冲刺港交所:5个月期内亏2224万 SIG与红杉中国是股东
- 小试牛刀:Go 反射帮我把 Excel 转成 Struct
- OpenShift 4 - 定制 RHACS 安全策略,阻断生产集群使用高风险 Registry
- 为什么要分库分表?
- The JVM a class loader
- NC | 中国农大草业学院杨高文组揭示发现多因子干扰会降低土壤微生物多样性的积极效应...
- RecyclerView高效使用第三节
- Nuget打包并上传教程
- The meaning of node_exporter performance monitoring information collection in Prometheus
- 力扣:714. 买卖股票的最佳时机含手续费
猜你喜欢

基于最小二乘法和SVM从天气预报中预测太阳能发电量(Matlab代码实现)

模板与泛型编程值typelist实现

Analysis of the startup source code of hyperf (2) - how the request reaches the controller

"Listen to me, thank you" can be said in ancient poetry?Tsinghua University has developed an artifact of "Searching Sentences According to Meaning", which can search for the famous sayings you want wi

Excel快速对齐表格的中姓名(两个字姓名和三个字姓名对齐)

LeetCode二叉树系列——110.平衡二叉树

Asynchronous processing business using CompletableFuture

Architecture actual combat battalion module 8 message queue table structure design

The 232-layer 3D flash memory chip is here: the single-chip capacity is 2TB, and the transmission speed is increased by 50%

Message queue data storage MySQL table design
随机推荐
LeetCode二叉树系列——222.完全二叉树的节点个数
c语言hello world代码(代码编程入门)
Advanced Mathematics - Commonly Used Indefinite Integral Formulas
[Pytorch] F.softmax() method description
LeetCode二叉树系列——110.平衡二叉树
TCP详解
OAuth2:使用JWT令牌
Numbers that appear only once in LeetCode
2021 OWASP TOP 10 漏洞指南
The magic of SQL MERGE statement (detailed instructions)
R语言检验样本是否符合正态性(检验样本是否来自一个正态分布总体):shapiro.test函数检验样本是否符合正态分布(normality test)
OAuth2:四种授权方式
Redis与分布式:集群搭建
Selenium自动化中无头浏览器的应用
Word表格转到Excel中
学习笔记12--路径-速度分解法之局部路径搜索
Ubantu专题4:xshell、xftp连接接虚拟机以及设置xshell复制粘贴快捷键
BigDecimal 简介,常用方法
abaqus find contact pairs报错:surface name is already in use
NPM淘宝镜像(最新版本)于2021-11-21 16:53:52发布新版本npm镜像[通俗易懂]