Android之在RecyclerView列表中实现单选

一、实现效果

单选、可取消选中、列表数据可更新(选择状态清空,可重新选择)

RecyclerView列表单选

二、实现步骤

仅展示部分核心代码,请主要参考适配器的定义

1、Item布局

selected_tip_list_item.xml文件
包含一个TextView和一个右侧选中的图片ImageView√

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"xmlns:app="http://schemas.android.com/apk/res-auto"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="42dp"android:orientation="horizontal"android:gravity="center_vertical"android:paddingStart="8dp"android:paddingEnd="8dp"android:paddingTop="6dp"android:paddingBottom="6dp"><TextViewandroid:id="@+id/tv_tip_name"android:layout_width="wrap_content"android:layout_height="match_parent"android:text="账号1"android:textColor="@color/color_333333"android:textSize="@dimen/sp_17"android:gravity="center_vertical"/><Viewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><ImageViewandroid:id="@+id/img_selected_icon"android:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="gone"android:src="@mipmap/selected_tip_icon"/></LinearLayout></LinearLayout>

2、Activity布局

SmartRefreshLayout搭配RecyclerView的使用可参考另一篇文章:Android中SmartRefreshLayout+RecyclerView实现下拉刷新和上拉加载(分页)显示网络请求数据

<com.scwang.smartrefresh.layout.SmartRefreshLayoutandroid:id="@+id/refresh_view_tip_list"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycler_view_select_tip"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="5dp"android:layout_marginBottom="10dp"/>
</com.scwang.smartrefresh.layout.SmartRefreshLayout>

3、RecyclerView的适配器

activity内部自定义适配器TipListAdapter

class TipListAdapter extends RecyclerView.Adapter<MyTipViewHolder>{private boolean isClick = false;private int mPosition = -1; //当前已选中位置public int getmPosition() {return mPosition;}public boolean isClick() {return isClick;}public void setmPosition(int mPosition,boolean isClick) {this.mPosition = mPosition;this.isClick = isClick;}@NonNull@Overridepublic MyTipViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View v = View.inflate(AddTipActivity.this,R.layout.select_tip_list_item, null);MyTipViewHolder holder = new MyTipViewHolder(v);holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//将点击选中的Item信息赋值给上方的输入框mEditTipName.setText(holder.mTvTipName.getText().toString());if (!isClick){setmPosition(holder.getBindingAdapterPosition(),true);}else{setmPosition(holder.getBindingAdapterPosition(),getmPosition() != holder.getBindingAdapterPosition());}notifyDataSetChanged();}});return holder;}@Overridepublic void onBindViewHolder(@NonNull MyTipViewHolder holder, int position) {String info = mTipBeanList.get(position);holder.mTvTipName.setText(info);if (getmPosition() == position && isClick) {//选中某行holder.itemView.setBackground(getDrawable(R.drawable.finished_product_selected_button_background2));holder.mTvTipName.setTextColor(ContextCompat.getColor(AddTipActivity.this,R.color.color_D32124));holder.mImgSelectedIcon.setVisibility(View.VISIBLE);}else if (getmPosition() == position && !isClick){//取消已选中行mEditTipName.setText("");holder.itemView.setBackground(getDrawable(R.drawable.unselected_tip_background));holder.mImgSelectedIcon.setVisibility(View.GONE);holder.mTvTipName.setTextColor(ContextCompat.getColor(AddTipActivity.this,R.color.color_333333));}else {holder.itemView.setBackground(getDrawable(R.drawable.unselected_tip_background));holder.mImgSelectedIcon.setVisibility(View.GONE);holder.mTvTipName.setTextColor(ContextCompat.getColor(AddTipActivity.this,R.color.color_333333));}}@Overridepublic int getItemCount() {return mTipBeanList.size();}//列表更新时调用的方法public void refreshData(List<String> data) {mTipBeanList.clear();mTipBeanList.addAll(data);//列表数据刷新时所有Item均恢复未选中状态setmPosition(-1,false);notifyDataSetChanged();}}class MyTipViewHolder extends RecyclerView.ViewHolder{TextView mTvTipName;ImageView mImgSelectedIcon;  MyTipViewHolder(View itemView) {super(itemView);mTvTipName = itemView.findViewById(R.id.tv_tip_name);mImgSelectedIcon = itemView.findViewById(R.id.img_selected_icon);}}

3、Activity内调用示例

(1)绑定控件
@InjectView(id = R.id.refresh_view_tip_list)
private SmartRefreshLayout mRefreshLayout;@InjectView(id = R.id.recycler_view_select_tip)
private RecyclerView mRecyclerViewAllTips;

(2)初始化列表和适配器

adapter = new TipListAdapter();
mRecyclerViewAllTips.setAdapter(adapter);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
mRecyclerViewAllTips.setLayoutManager(linearLayoutManager);
mRecyclerViewAllTips.setItemAnimator(new DefaultItemAnimator());
//设置下拉刷新和上拉加载样式
mRefreshLayout.setRefreshHeader(new ClassicsHeader(this));
mRefreshLayout.setOnMultiPurposeListener(new SimpleMultiPurposeListener(){//下拉刷新@Overridepublic void onRefresh(@NonNull RefreshLayout refreshLayout) {super.onRefresh(refreshLayout);//????这里去调用请求数据的方法,并更新adaptermRecyclerViewAllTips.smoothScrollToPosition(0);mRefreshLayout.finishRefresh(1000);}});
//首次进入页面自动刷新
mRefreshLayout.autoRefresh();
(3)数据请求后,更新adapter

更新列表调用方法如下:
(mList为请求到的数据)

adapter.refreshData(mList);

三、完成,Nice!

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

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

相关文章

Spring Boot集成MyBatis实现多数据源访问的“秘密”

文章目录 为什么需要多数据源&#xff1f;Spring Boot集成MyBatis的基础配置使用多数据源小结 &#x1f389;Spring Boot集成MyBatis实现多数据源访问的“秘密” ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&…

力扣:178. 分数排名(Python3)

题目&#xff1a; 表: Scores ---------------------- | Column Name | Type | ---------------------- | id | int | | score | decimal | ---------------------- 在 SQL 中&#xff0c;id 是该表的主键。 该表的每一行都包含了一场比赛的分数。Score …

TCP /UDP协议的 socket 调用的过程

在传输层有两个主流的协议 TCP 和 UDP&#xff0c;socket 程序设计也是主要操作这两个协议。这两个协议的区别是什么呢&#xff1f;通常的答案是下面这样的。 TCP 是面向连接的&#xff0c;UDP 是面向无连接的。TCP 提供可靠交付&#xff0c;无差错、不丢失、不重复、并且按序…

Selenium介绍及基本使用方法

Selenium是一个开源、免费、简单、灵活&#xff0c;对Web浏览器支持良好的自动化测试工具&#xff0c;在UI自动化、爬虫等场景下是十分实用的&#xff0c;能够熟练掌握并使用Selenium工具可以大大的提高效率。 Selenium简介 Selenium支持多平台、多浏览器、多语言去实现自动化…

深入理解强化学习——马尔可夫决策过程:动作价值函数

分类目录&#xff1a;《深入理解强化学习》总目录 不同于马尔可夫奖励过程&#xff0c;在马尔可夫决策过程中&#xff0c;由于动作的存在&#xff0c;我们额外定义一个动作价值函数&#xff08;Action-value Function&#xff09;。我们用 Q π ( s , a ) Q^\pi(s, a) Qπ(s,a)…

线程提交线程到线程池,有几种方式,哪一种方式是工作中不能使用的,无法捕捉异常,线程池的拒绝策略,线程池的提交方式

线程池的工作原理 JDK中提交线程到线程池&#xff0c;有几种方式&#xff0c;哪一种方式是工作中不能使用的&#xff0c;无法捕捉异常 两种提交任务的方法 ExecutorService 提供了两种提交任务的方法&#xff1a; execute()&#xff1a;提交不需要返回值的任务 submit()&a…

【C语言】多组输入

C系列文章目录 目录 C系列文章目录 一、什么是多组输入&#xff1f; 二、如何使用多组输入 2.1&#xff0c;试题举例讲解 2.2&#xff0c;错误解法 2.3&#xff0c;我们实现多组输入的思路 2.4&#xff0c;第一种正确的解法 2.5&#xff0c;第二种正确的解法 2.6&…

Python入门教程 | Python3 字典(dict)

Python3 字典 字典是另一种可变容器模型&#xff0c;且可存储任意类型对象。 Python3中的字典是一种无序、可变、可迭代的数据结构&#xff0c;它由键&#xff08;key&#xff09;和对应的值&#xff08;value&#xff09;组成。字典在Python中被视为可变对象&#xff0c;这意…

ES ElasticSearch安装、可视化工具kibana安装

1、安装ES docker run -d --name es9200 -e "discovery.typesingle-node" -p 9200:9200 elasticsearch:7.12.1访问测试&#xff1a; http://域名:9200/ 2、安装kibana对es进行可视化操作 执行命令 docker run -d --name kibana5601 -p 5601:5601 kibana:7.1.12.修…

如何实现在公网下使用navicat图形化工具远程连接本地内网的MariaDB数据库

公网远程连接MariaDB数据库【cpolar内网穿透】 文章目录 公网远程连接MariaDB数据库【cpolar内网穿透】1. 配置MariaDB数据库1.1 安装MariaDB数据库1.2 测试局域网内远程连接 2. 内网穿透2.1 创建隧道映射2.2 测试随机地址公网远程访问3. 配置固定TCP端口地址3.1 保留一个固定的…

Redis深入理解-Socket连接建立流程以及文件事件处理机制

Redis Server 运行原理图 Redis 服务器中 Socket 网络建立以及文件事件模型 一个 redis 单机&#xff0c;可以抗几百上千的并发&#xff0c;这里的并发指的就是同时可以有几百个 client 对这个 redis server 发起请求&#xff0c;都需要去建立网络连接&#xff0c;同时间可能会…

利用 docker 实现JMeter分布式压测

为什么需要分布式&#xff1f; 在工作中经常需要对一些关键接口做高QPS的压测&#xff0c;JMeter是由Java 语言开发&#xff0c;没创建一个线程&#xff08;虚拟用户&#xff09;&#xff0c;JVM默认会为每个线程分配1M的堆栈内存空间。受限于单台试压机的配置很难实现太高的并…

YAML 深入解析:从语法到最佳实践

什么是YAML YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种人类可读的数据序列化语言。它的设计目标是使数据在不同编程语言之间交换和共享变得简单。YAML采用了一种简洁、直观的语法&#xff0c;以易于阅读和编写的方式表示数据结构。 YAML广泛应用于配置文…

【OpenCV实现图像:制作酷炫的动画效果】

文章目录 概要生成背景图添加点动画添加文本显示小结 概要 首先&#xff0c;通过导入必要的库&#xff0c;包括NumPy用于数学运算和Matplotlib库用于数据可视化。随后&#xff0c;创建图形和轴&#xff0c;初始化点的位置&#xff0c;以及编写初始化函数和更新函数。 初始化函…

C语言归并排序

以梦为马&#xff0c;不负韶华 文章目录 引入&#xff1a;实现原理问题引出&#xff1a;递归实现&#xff1a;迭代实现稳定性分析&#xff1a;总结&#xff1a; 引入&#xff1a; 如何将两个有序数组&#xff08;假设为升序&#xff09;合并为一个有序数组&#xff1f; 双指针…

yolov5/v7修改标签和检测框显示【最全】

《记录自己在使用yolov5遇到的一些问题》同时也供大家参考&#xff0c;如果对你们有帮助&#xff0c;希望大家可以给个点赞、收藏鼓励下&#xff0c;非常感谢&#xff01; 以自带的一张图片作为示例,yolov5(6.1版本)的初始检测框应该是如下图所示 修改线条粗细、隐藏标签、隐…

EI论文故障识别程序:DBN深度置信/信念网络的故障识别Matlab程序,数据由Excel导入,直接运行!

​适用平台&#xff1a;Matlab2021b版及以上 本程序参考中文EI期刊《基于变分模态分解和改进灰狼算法优化深度置信网络的自动转换开关故障识别》中的深度置信网络&#xff08;Deep Belief Network&#xff0c;DBN&#xff09;部分进行故障识别&#xff0c;程序注释清晰&#x…

Python之学生信息管理系统

目录 一、基础界面实现 1、主函数 2、保持循环&#xff0c;获取用户需求 二、函数实现模块功能 1、添加学生信息 2、删除学生信息 3、修改学生信息 4、查找全部学生信息 5、退出系统 三、整合代码 1、 完整代码 2、完整实现过程 实现 打印功能菜单、添加学生信息、删…

想自学软件测试?一般人我还是劝你算了吧。。。

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

<keep-alive>作用及用法

<keep-alive>是Vue.js的内置组件。它用于缓存具有相同组件树的组件。当组件使用<keep-alive>包裹时&#xff0c;组件不会被销毁&#xff0c;而是会缓存到内存中&#xff0c;等到下次再次渲染时&#xff0c;直接使用缓存中的组件实例。 <keep-alive>有以下几…