RecycleView基本使用及常见问题汇总

RecycleView属于android基础组件,比较常用,下面总结下其使用的基础流程及常见问题解决办法(常见问题会定期更新)

基础使用

  • 首先在xml里引入RecycleView
<?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="match_parent"android:layout_height="match_parent"tools:context=".RecycleTestActivity"><SeekBarandroid:id="@+id/sk"app:layout_constraintTop_toTopOf="parent"android:layout_width="match_parent"android:padding="20dp"android:layout_height="wrap_content"/><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_marginTop="50dp"android:layout_width="match_parent"android:layout_height="match_parent"android:scrollbars="vertical"app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>
</androidx.constraintlayout.widget.ConstraintLayout>
  • 编写adapter,分以下几步

1.创建自定义adapter类,创建内部类MyViewHolder,并实现RecycleView的ViewHolder,参数传递view

class MyAdapter(val data:List<Int>) {class MyHolder(view:View):ViewHolder(view){}
}
  1. 创建item layout,里面根据需要创建对应的布局,这里假如里面仅有一个progressbar,注意根布局高度改为wrap content,否则的话实际效果每个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"xmlns:app="http://schemas.android.com/apk/res-auto"><ProgressBarandroid:id="@+id/progress"android:layout_width="wrap_content"android:layout_height="wrap_content"style="@style/Widget.AppCompat.ProgressBar.Horizontal"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

3.在MyHolder里获取到progressBar

class MyAdapter(val data:List<Int>) {class MyHolder(view:View):ViewHolder(view){val progressBar:ProgressBar = view.findViewById(R.id.progress)}
}

4.MyAdapter继承Recycleview.Adapter,并实现对应的三个方法

class MyAdapter(val data:List<Int>):Adapter<MyAdapter.MyHolder>() {class MyHolder(view:View):ViewHolder(view){val progressBar:ProgressBar = view.findViewById(R.id.progress)}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyHolder {TODO("Not yet implemented")}override fun getItemCount(): Int {TODO("Not yet implemented")}override fun onBindViewHolder(holder: MyHolder, position: Int) {TODO("Not yet implemented")}
}
  1. 在onCreateViewHolder里创建MyHolder并返回,在getItemCount里返回 data.size,在onBindViewHolder里绑定组件
 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyHolder {val view = LayoutInflater.from(parent.context).inflate(R.layout.my_item, parent, false)return MyHolder(view)}override fun getItemCount(): Int {return data.size}override fun onBindViewHolder(holder: MyHolder, position: Int) {holder.progressBar.progress = data[position]}
  1. 在activity里获取recycleView,设置adapter 设置manager,adapter创建时把数据传入
recyclerView = findViewById(R.id.recyclerView)myAdapter = MyAdapter(list)recyclerView.adapter = myAdapterrecyclerView.layoutManager = LinearLayoutManager(this)

遇到的问题

1.当item里有progress bar时,数据变化让progress bar进度条变化,此时没什么问题,但如果progress bar设置了自定义的progressDrawable,那么其中一个item的进度条变化就会导致别的item显示的progress进度出现异常

android:progressDrawable="@drawable/progress_bg"

progress_bg文件内容

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><!--背景色--><item android:id="@+id/background"><shape><corners android:radius="100px" /><solid android:color="@color/progress_track" /></shape></item><!--进度条色--><item android:id="@+id/progress"><clip android:clipOrientation="horizontal"><shape><corners android:radius="100px" /><solid android:color="@color/progress_indicator" /></shape></clip></item>
</layer-list>

解决办法:
在onBindViewHolder时调用 holder.ProgressBar.progressDrawable.mutate()

  override fun onBindViewHolder(holder: MyViewHolder, position: Int) {holder.ProgressBar.progressDrawable.mutate()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/625246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣77. 组合

递归 思路&#xff1a; 找到一个长度为 nnn 的序列 aaa 的所有子序列&#xff0c;代码框架&#xff1a; std::vector<int> temp; void dfs(int cur, int n) {if (cur n 1) {// 记录答案// ...return;}// 考虑选择当前位置temp.push_back(cur);dfs(cur 1, n, k);temp.…

The Plant cell:DAP-seq技术助力揭示BBR/BPC家族的MdBPC2转录因子调控苹果生长素的生物合成从而促进苹果生长及矮化

植物生长素&#xff08;IAA&#xff09;在植物生长发育过程中起着重要的作用。其化学本质是吲哚乙酸。主要作用是使植物细胞壁松弛&#xff0c;从而使细胞生长伸长&#xff0c;在许多植物中还能增加RNA和蛋白质的合成。 目前BARLEY B RECOMBINANT/BASIC PENTACYSTEINE (BBR/BP…

Unity对应SDK和NDK版本的对照表

官网&#xff1a;Unity - Manual: Android environment setup 本人安装的是2022版本长期支持版本2022.3.15f1c1 安装Java的JDK环境就不在这里展开了&#xff0c;就记录下对Android SDK的设置&#xff0c;要与Unity的版本对应&#xff0c;否则会出现很多莫名奇妙的问题。 打开…

自定义vector的实现

实现前需要思考的一个问题 为什么需要将空间的申请与对象的构建分开 查看vector的模板参数时可以看到其有第三个参数是空间适配器allocator&#xff0c;查找其对外提供的成员函数不难发现它的实现逻辑是将空间的申请与对象的构建分开的&#xff0c;为什么呢&#xff1f;不弄清…

SpringBoot异常处理(Whitelabel Error Page和自定义全局异常处理页面)和整合ajax异常处理

SpringBoot异常处理&#xff08;Whitelabel Error Page和自定义全局异常处理页面&#xff09;和整合ajax异常处理 1、springboot自带的异常处理页面Whitelabel Error Page SpringBoot默认的处理异常的机制&#xff1a;SpringBoot 默认的已经提供了一套处理异常的机制。一旦程…

(最全)数字经济-215个工具变量汇总(更新至2024年)

一、引言 工具变量是一种在统计学和计量经济学中常用的技术&#xff0c;用于处理因果关系研究中的内生性问题。内生性问题通常是由于遗漏变量、双向因果关系或测量误差等原因造成的&#xff0c;这会导致估计结果出现偏误。工具变量的使用可以帮助解决这一问题。收集了CSSCI期刊…

MongoDB 索引管理

文章目录 前言1. 术语介绍1.1 index / key1.2 Coverd Query1.3 IXSCAN / COLLSCAN1.4 Selectivity1.5 Index Prefix 2. 索引原理3. 索引的维护3.1 创建索引语法3.2 单字段索引3.3 多字段复合索引3.4 数组的多列索引3.5 全文索引3.6 Hash 索引3.7 TTL 索引3.8 删除索引3.9 后台创…

基于springboot书籍学习平台源码和论文

首先,论文一开始便是清楚的论述了平台的研究内容。其次,剖析平台需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确平台的需求。然后在明白了平台的需求基础上需要进一步地设计平台,主要包罗软件架构模式、整体功能模块、数据库设计。本项…

MongoDB安装与基本使用

一、简介 1.1 Mongodb 是什么 MongoDB 是一个基于分布式文件存储的数据库&#xff0c;官方地址 https://www.mongodb.com/ 1.2 数据库是什么 数据库&#xff08; DataBase &#xff09;是按照数据结构来组织、存储和管理数据的 应用程序 1.3 数据库的作用 数据库的…

使用Python向RabbitMQ发送JSON数据只需要一个send_json方法

发送JSON数据 通过调用rabbitmq.send_json(channel, user, queueresult)能够更简单的实现发送JSON数据。 生产者 import json import rabbitmq# 建立连接 connection rabbitmq.get_connection()# 创建管道 channel connection.channel()# 创建队列 queue_name "user…

Python 时间相关处理

datetime from datetime import datetime, timedelta, date fmt&#xff1a;指定日期字符串的格式&#xff0c;其中%Y表示四位年份&#xff0c;%m表示两位月份&#xff0c;%d表示两位日 将日期字符串转为日期对象 datetime.striptime(date_str,fmt) date_str "2022-01-0…

创建React步骤

确保电脑已经安装了node.js以后&#xff0c;打开终端进入目标文件夹 cd xxx(文件夹 npx create-react-app react01(替换为你自己的react名称) 可能会出现是否安装xxx,输入y即可 没有报错信息后&#xff0c;输入 cd react01 npm start 会自动跳转到react界面&#xff0c;就…

翻译: Streamlit从入门到精通 部署一个机器学习应用程序 四

Streamlit从入门到精通 系列&#xff1a; 翻译: Streamlit从入门到精通 基础控件 一翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二翻译: Streamlit从入门到精通 构建一个机器学习应用程序 三 1. 5. 如何部署一个Streamlit应用 部署是将应用程序从开发…

把字符串转换成整数(acwing)

把字符串转换成整数 请你写一个函数 StrToInt&#xff0c;实现把字符串转换成整数这个功能。 当然&#xff0c;不能使用 atoi 或者其他类似的库函数。 数据范围 输入字符串长度 [0,20]。 样例 输入&#xff1a;“123” 输出&#xff1a;123 注意: 你的函数应满足下列条件&…

Linux操作系统——重定向与缓冲区

1.理解一下struct file内核对象 上一篇文章&#xff08;文件详解&#xff09;我们一直在谈&#xff0c;一个文件要被访问就必须要先被打开&#xff0c;打开之前就必须要先把文件加载到内存&#xff0c;同时呢我们的操作系统为了管理文件也会为我们的文件创建相对应的struct fi…

数据库多表查询练习题

二、多表查询 1. 创建 student 和 score 表 CREATE TABLE student ( id INT ( 10 ) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR ( 20 ) NOT NULL , sex VARCHAR ( 4 ) , birth YEAR , department VARCHAR ( 20 ) , address VARCHAR ( 50 ) ); 创建 s…

Qt6入门教程 6:Qt元对象系统

目录 一.什么是Qt元对象系统&#xff1f; 二.编译时Qt Creator偷摸做了哪些事情&#xff1f; 1.uic 2.rcc 3.moc 一.什么是Qt元对象系统&#xff1f; Qt中的元对象系统&#xff08;Meta-Object System&#xff09;提供了对象间通信的信号和槽机制、运行时类型信息和动态属…

uniCloud + uView 上传图片,删除图片(含u-upload 组件的使用)

上传图片 <u-upload imageModeaspectFit height"250" :maxCount1 :fileList"fileList" afterRead"uploadOK" delete"delPic"> </u-upload>::v-deep .u-upload__button {width: 100% !important; }::v-deep .u-upload__wra…

基于JAVA+SSM框架开发的志愿者服务管理系统设计与实现【附源码】

&#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#x1f4dd; &#x1f680;&#x1f680;&#x1f6…

RK3568笔记九: DRM显示摄像头

若该文为原创文章&#xff0c;转载请注明原文出处。 一、介绍 学习DRM的目的是想做类似NVR显示多路实时流&#xff0c;通过勇哥&#xff08;Marc)的指导&#xff0c;大概流程是通过Zlmedia拉流&#xff0c;RK3568的MPP解码,DRM显示&#xff0c;可以使用HDMI或DIS屏幕&#xf…