当前位置: 首页 > news >正文

Android 中 自定义 RecyclerView 控件限制显示高度

1、缘由

  • 在 Android 开发中,如果想限制 RecyclerView 控件显示的子项数量,一般是在布局文件中通过设置控件高度的方式来实现,这种方式无论内容项多少,都会显示固定的高度。如果内容项多于显示高度,可通过上下滚动来显示全部内容;如果内容项小于显示高度,还是会按设置高度显示,此时 RecyclerView 控件就会有出现空白区域。如下所示:

在这里插入图片描述

  • 若想实现既限制 RecyclerView 控件显示数量,又不出现空白区域的效果,则需要通过自定义控件来实现。

2、自定义 RecyclerView 控件

package com.android.recycleview.viewimport android.content.Context
import android.util.AttributeSet
import androidx.core.content.withStyledAttributes
import androidx.recyclerview.widget.RecyclerView
import com.android.recycleview.Rclass MaxHeightRecyclerView @JvmOverloads constructor(context: Context,attrs: AttributeSet? = null,defStyle: Int = 0,
): RecyclerView(context, attrs, defStyle) {private var maxHeight = 0init {attrs?.let {context.withStyledAttributes(it, R.styleable.MaxHeightRecyclerView) {val height = getDimension(R.styleable.MaxHeightRecyclerView_maxHeight, 0f)if (height > 0) {maxHeight = height.toInt()}}}}override fun onMeasure(widthSpec: Int, heightSpec: Int) {val height = MeasureSpec.getSize(heightSpec)var tmpHeight = heightSpecif (maxHeight in 1..<height) {tmpHeight = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST)}super.onMeasure(widthSpec, tmpHeight)}
}

3、完整示例

(1)子项布局文件

  • item_recyclerview.xml
<?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"xmlns:app="http://schemas.android.com/apk/res-auto"><TextViewandroid:id="@+id/text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="@dimen/sp_16"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toTopOf="parent"/></androidx.constraintlayout.widget.ConstraintLayout>

(2)适配器

  • CustomRecyclerViewAdapter.kt
package com.android.recycleview.adapterimport android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.android.recycleview.Rclass CustomRecyclerViewAdapter(private var items: List<String>
): RecyclerView.Adapter<CustomRecyclerViewAdapter.ViewHolder>() {inner class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {private val textView = itemView.findViewById<TextView>(R.id.text_view)fun setText(text: String) {textView.text = text}}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {val view = LayoutInflater.from(parent.context).inflate(R.layout.item_recyclerview, parent, false)return ViewHolder(view)}override fun getItemCount(): Int {return items.size}override fun onBindViewHolder(holder: ViewHolder, position: Int) {holder.setText(items[position])}@SuppressLint("NotifyDataSetChanged")fun setData(itemList: List<String>) {items = itemListnotifyDataSetChanged()}
}

(3)activity 布局文件

  • activity_recyclerview.xml
<?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="match_parent"xmlns:app="http://schemas.android.com/apk/res-auto"><com.android.recycleview.view.MaxHeightRecyclerViewandroid:id="@+id/recycleView"android:layout_width="@dimen/dp_150"android:layout_height="wrap_content"android:background="@color/purple_200"android:scrollbars="vertical"android:scrollbarSize="@dimen/dp_6"android:fadeScrollbars="false"app:maxHeight="@dimen/dp_160"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toTopOf="parent"android:layout_marginStart="@dimen/dp_50"android:layout_marginTop="@dimen/dp_50"/><Buttonandroid:id="@+id/button_less"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="@dimen/sp_18"android:text="@string/less_max_height"app:layout_constraintLeft_toRightOf="@+id/recycleView"app:layout_constraintTop_toTopOf="@+id/recycleView"android:layout_marginStart="@dimen/dp_30"/><Buttonandroid:id="@+id/button_more"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="@dimen/sp_18"android:text="@string/more_max_height"app:layout_constraintLeft_toLeftOf="@+id/button_less"app:layout_constraintTop_toBottomOf="@+id/button_less"android:layout_marginTop="@dimen/dp_20"/></androidx.constraintlayout.widget.ConstraintLayout>
  • MaxHeightRecyclerView 控件的 layout_height 设置为 wrap_content 按内容显示,而不是固定的高度值。

(4)activity 文件

  • RecyclerViewActivity.kt
package com.android.recycleview.uiimport android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import com.android.recycleview.adapter.CustomRecyclerViewAdapter
import com.android.recycleview.databinding.ActivityRecyclerviewBindingclass RecyclerViewActivity: AppCompatActivity() {private lateinit var viewBinding: ActivityRecyclerviewBindingprivate lateinit var adapter: CustomRecyclerViewAdapteroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)viewBinding = ActivityRecyclerviewBinding.inflate(layoutInflater)setContentView(viewBinding.root)val dataList = listOf("子项1", "子项2", "子项3", "子项4", "子项5", "子项6", "子项7", "子项8")adapter = CustomRecyclerViewAdapter(dataList)viewBinding.recycleView.adapter = adapterviewBinding.recycleView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)viewBinding.buttonLess.setOnClickListener {val items = listOf("子项1", "子项2", "子项3")adapter.setData(items)}viewBinding.buttonMore.setOnClickListener {val items = listOf("子项1", "子项2", "子项3", "子项4", "子项5", "子项6", "子项7", "子项8")adapter.setData(items)}}
}

(5)显示效果

在这里插入图片描述


文章转载自:

http://YSN02aDr.kfbth.cn
http://Uzi9MXjG.kfbth.cn
http://FBk4szHQ.kfbth.cn
http://6nonzkvA.kfbth.cn
http://R1lDN8af.kfbth.cn
http://hwtMVuTf.kfbth.cn
http://a9Caeot7.kfbth.cn
http://TrE3npYg.kfbth.cn
http://rgdoNWh3.kfbth.cn
http://NtRYaqYv.kfbth.cn
http://ur0eXrO6.kfbth.cn
http://lYbCiAwA.kfbth.cn
http://lobH5ABf.kfbth.cn
http://yIvdoIxu.kfbth.cn
http://J4QAujzl.kfbth.cn
http://lo3UYiSc.kfbth.cn
http://0PG5PGoP.kfbth.cn
http://qtD9nIlk.kfbth.cn
http://DjXfbPVf.kfbth.cn
http://syY4S2Vs.kfbth.cn
http://NGpBLd7a.kfbth.cn
http://53ViWCrL.kfbth.cn
http://ueBV31EO.kfbth.cn
http://WPgCPULK.kfbth.cn
http://8iOlVxJE.kfbth.cn
http://DjiqXhLa.kfbth.cn
http://dDwVGA5j.kfbth.cn
http://L4dCcxGa.kfbth.cn
http://d14bJ6vC.kfbth.cn
http://KcOIFkWq.kfbth.cn
http://www.dtcms.com/a/372836.html

相关文章:

  • Codesy中的UDP发送信息
  • Hadoop进程:深入理解分布式计算引擎的核心机制
  • SQL Server死锁排查实战指南
  • 自学嵌入式第三十八天:数据库
  • 【开题答辩全过程】以 基于springboot的酒店管理系统设计与实现为例,包含答辩的问题和答案
  • SpringBoot控制层接收参数处理、Logback日志入门和使用
  • Python快速入门专业版(十三):Python变量进阶:全局变量与局部变量(含global关键字用法)
  • 深度学习(二):神经元与神经网络
  • 如何在不同 iOS 设备上测试和上架 uni-app 应用 实战全流程解析
  • iOS 开发全流程实战 基于 uni-app 的 iOS 应用开发、打包、测试与上架流程详解
  • [论文阅读] 人工智能 + 软件工程 | 大模型破局跨平台测试!LLMRR让iOS/安卓/鸿蒙脚本无缝迁移
  • 汇编基础1
  • CSS @scope与12个降低css冲突方法
  • pytorch 中是如何实现embeding 的
  • 【.Net技术栈梳理】02-核心框架与运行时(GC管理)
  • 洗完头后根据个人需求选择合适的自然风干 | 电吹风 (在保护发质的同时,也能兼顾到生活的便利和舒适。)
  • 人才教育导向下:老年生活照护实训室助力提升学生老年照护服务能力
  • Typescript入门-类型断言讲解
  • 使用Pycharm进行远程ssh(以Featurize为例)
  • 云原生:微服务与Serverless指南
  • 时序数据库选型指南:大数据与物联网时代下的深度剖析与 Apache IoTDB 实践
  • Python 实现 HTML 转 Word 和 PDF
  • 亚马逊长尾关键词怎么找?从传统运营到DeepBI的智能策略演进
  • 打造高效Jenkins CICD环境全解析
  • 学习笔记:MYSQL(4)
  • Vue的响应式底层原理:Proxy vs defineProperty
  • Jenkins运维之路(初识流水线)
  • 内窥镜冷光源
  • Linux设备内存不足如何处理
  • 【JavaSE】复习总结