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

Android RecyclerView 实现 GridView ,并实现点击效果及方向位置的显示

效果图


一、引入

 implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'

二、使用步骤

1.Adapter

public class UnAdapter extends BaseQuickAdapter<UnBean.ResultBean, BaseViewHolder> {private int selectedPosition = RecyclerView.NO_POSITION; // 用于记录当前选中的位置private int lastSelectedPosition = RecyclerView.NO_POSITION; // 上一次选中的位置private int spanCount = 4; // 每行显示的列数// 处理item点击事件的方法public void onItemClick(int position) {// 如果点击的是当前选中的item,则不执行任何操作(或者执行特定的操作)if (position == selectedPosition) {return;}// 更新选中状态if (selectedPosition != RecyclerView.NO_POSITION) {// 如果之前有选中的item,先通知适配器刷新它,以恢复默认背景notifyItemChanged(selectedPosition);}// 更新选中位置lastSelectedPosition = selectedPosition;selectedPosition = position;// 通知适配器刷新新选中的itemnotifyItemChanged(selectedPosition);}// (可选)如果需要,可以添加一个方法来处理取消选中item的情况private void deselectItem(int position) {if (position == selectedPosition) {selectedPosition = RecyclerView.NO_POSITION;}}public  UnAdapter(int layoutResId, @Nullable List<UnBean.ResultBean> data) {super(layoutResId, data);}@SuppressLint("ResourceAsColor")@Overrideprotected void convert(BaseViewHolder helper, UnBean.ResultBean item) {ImageView fx_rightImg = helper.getView(R.id.fx_right_img);ImageView fx_leftImg = helper.getView(R.id.fx_left_img);LinearLayout fx_upLayout = helper.getView(R.id.fx_up_layout);LinearLayout bgLayout = helper.getView(R.id.bg_layout);// 根据是否选中来设置背景if (helper.getLayoutPosition() == selectedPosition) {bgLayout.setBackgroundResource(R.drawable.shape_blue_8);helper.setTextColor(R.id.cd_tv, mContext.getColor(R.color.white));} else if (helper.getLayoutPosition() == lastSelectedPosition && lastSelectedPosition != RecyclerView.NO_POSITION) {bgLayout.setBackgroundResource(R.drawable.shape_bg_position_sel);helper.setTextColor(R.id.cd_tv, mContext.getColor(R.color.blue_text));} else {bgLayout.setBackgroundResource(R.drawable.shape_bg_position_sel);helper.setTextColor(R.id.cd_tv, mContext.getColor(R.color.blue_text));}// 设置点击监听器(注意:这里应该在ViewHolder的构造函数中设置,以避免重复设置)// 但为了简化示例,这里直接在convert中设置(不推荐)bgLayout.setOnClickListener(v -> {onItemClick(helper.getPosition());});// 计算当前项位于哪一行int position = helper.getAdapterPosition(); // 获取当前项的索引int row = position / spanCount; // 整数除法得到当前行号(注意:这里假设没有头部或脚部项)// 计算当前项在当前行的列索引(从0开始)int column = position % spanCount;// 判断是否是每行的首项boolean isFirstItemInRow = column == 0;// 判断是否是每行的尾项// 注意:这里的判断需要考虑是否是最后一行且不是整除spanCount的情况boolean isLastItemInRow = (position + 1) % spanCount == 0 || position == getItemCount() - 1;// 或者更精确地判断尾项(仅当当前项不是最后一行的唯一项时才需要额外检查)boolean isLastItemInRowPrecise = (position + 1) % spanCount == 0 ||(position == getItemCount() - 1 && position % spanCount != spanCount - 1);// 判断当前项是否为列表中的最后一位boolean isLastItemInList = position == getItemCount() - 1;// 判断行数的奇偶性if (row % 2 == 0) {fx_rightImg.setVisibility(View.VISIBLE);if (isFirstItemInRow) {fx_upLayout.setVisibility(View.GONE);}if (isLastItemInRowPrecise) {fx_upLayout.setVisibility(View.VISIBLE);fx_rightImg.setVisibility(View.GONE);}} else {fx_leftImg.setVisibility(View.GONE);fx_rightImg.setVisibility(View.VISIBLE);fx_upLayout.setVisibility(View.GONE);if (isFirstItemInRow) {fx_upLayout.setVisibility(View.VISIBLE);}if (isLastItemInRowPrecise) {fx_upLayout.setVisibility(View.GONE);fx_leftImg.setVisibility(View.GONE);}}// 根据是否为最后一位的逻辑来设置UIif (isLastItemInList) {fx_upLayout.setVisibility(View.GONE);fx_rightImg.setVisibility(View.GONE);}helper.setText(R.id.cd_tv, item.getTrain());}}

2. item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="@dimen/dimen_120"android:layout_height="@dimen/dimen_80"android:layout_marginLeft="@dimen/dimen_15"android:orientation="vertical"android:padding="@dimen/dimen_5"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/dp_40"android:orientation="horizontal"><LinearLayoutandroid:id="@+id/bg_layout"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"><TextViewandroid:id="@+id/cd_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="G2519"android:textColor="@color/c_3681ff" /></LinearLayout><LinearLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"><ImageViewandroid:id="@+id/fx_right_img"android:layout_width="@dimen/dimen_15"android:layout_height="@dimen/dimen_15"android:background="@drawable/icon_fx_right"android:visibility="gone" /><ImageViewandroid:id="@+id/fx_left_img"android:layout_width="@dimen/dimen_15"android:layout_height="@dimen/dimen_15"android:background="@drawable/icon_fx_left"android:visibility="gone" /></LinearLayout></LinearLayout><LinearLayoutandroid:id="@+id/fx_up_layout"android:layout_width="match_parent"android:layout_height="@dimen/dp_40"android:gravity="center_vertical"android:visibility="gone"><ImageViewandroid:layout_width="@dimen/dimen_15"android:layout_height="@dimen/dimen_15"android:layout_marginLeft="@dimen/dimen_25"android:background="@drawable/icon_fx_up" /></LinearLayout></LinearLayout>

3.应用

 fromAssets = ReadAsUtil.getFromAssets(this, "UnList.json");unBean = new Gson().fromJson(fromAssets, UnBean.class);unList = unBean.getResult();gridLayoutManager = new GridLayoutManager(this, 4);cdLv.setLayoutManager(gridLayoutManager);unAdapter = new UnAdapter(R.layout.item_layout, unList);cdLv.setAdapter(unAdapter);unAdapter.notifyDataSetChanged();

总结

如果对你有所帮助的话,不妨 点赞收藏
如果你有什么疑问的话,不妨 评论私信
青山不改,绿水长流 ,有缘江湖再见 ~

相关文章:

Android RecyclerView 实现 GridView ,并实现点击效果及方向位置的显示

效果图 一、引入 implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30 二、使用步骤 1.Adapter public class UnAdapter extends BaseQuickAdapter<UnBean.ResultBean, BaseViewHolder> {private int selectedPosition RecyclerView.NO_POSITIO…...

Centos中dnf和yum区别对比

dnf和yum是两种不同的包管理工具&#xff0c;它们各自具有独特的特点和优势&#xff0c;主要用于在Linux系统上安装、更新和卸载软件包。以下是dnf和yum之间的主要区别&#xff1a; 1. 依赖关系解决 dnf&#xff1a;dnf在处理依赖关系方面表现出更强的能力。它能够更高效地解…...

CVPT: Cross-Attention help Visual Prompt Tuning adapt visual task

论文汇总 当前的问题 图1:在VTAB-1k基准测试上&#xff0c;使用预训练的ViT-B/16模型&#xff0c;VPT和我们的CVPT之间的性能和Flops比较。我们将提示的数量分别设置为1、10、20、50,100,150,200。 如图1所示&#xff0c;当给出大量提示时&#xff0c;VPT显示了性能的显著下降…...

基于双向 LSTM 和 CRF 的序列标注模型

基于双向 LSTM 和 CRF 的序列标注模型 在自然语言处理中,序列标注是一项重要的任务,例如命名实体识别、词性标注等。本文将介绍如何使用 Keras 构建一个基于双向 LSTM 和 CRF 的序列标注模型。 一、引言 序列标注任务要求为输入序列中的每个元素分配一个标签。传统的方法可…...

为何美国与加拿大边界看似那么随意?

我们在《日本移民巴西超200万&#xff0c;会成第二个“巴勒斯坦”吗&#xff1f;》一文中探讨了日本移民巴西的历史&#xff0c;以及移民对巴西的风险与挑战。 今天我们来探讨美国与加拿大边界为什么那么随意,并整理了加拿大和美国的国界、省界、市界行政边界数据分享给大家&a…...

什么是触发器(Trigger)?触发器何时会被触发?

在数据库管理系统中&#xff0c;触发器是一种特殊的存储过程&#xff0c;它会在特定的表上执行插入、更新或删除操作时自动触发。 触发器的主要用途是维护数据的一致性和完整性&#xff0c;以及实现一些复杂的业务逻辑。 触发器何时会被触发&#xff1f; 触发器可以在以下几…...

一步一步优化一套生成式语言模型系统

以下是这套生成式语言模型解决任务的流程图概述&#xff1a; #mermaid-svg-keXg8yGoCyObKDtu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-keXg8yGoCyObKDtu .error-icon{fill:#552222;}#mermaid-svg-keXg8yGoCyO…...

Q必达任务脚本

文章目录 1.购买服务器地址2.部署教程3. 代码如下4. 如何联系我 1.购买服务器地址 服务器购买地址 https://t.aliyun.com/U/rUHk58 若失效&#xff0c;可用地址 https://www.aliyun.com/activity/wuying/dj?source5176.29345612&userCode49hts92d 2.部署教程 2024年最…...

问请问请问2312123213123

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…...

Vue3:快速生成模板代码

目录 一.模板代码 1.提供基础结构 2.定义组件名称 3.初始化数据和方法 4.应用样式 5.提高开发效率 二.操作 1.点击右下角设置按钮选择代码片段 2.输入vue.json&#xff0c;打开vue.json文件 3.构造模板 4.模板代码 5.使用 6.效果 一.模板代码 Vue3快速生成模板代…...

文件上传-php

查找方式 ***(1) 黑盒 查找(upload) 扫描 (2) 应用型 窗口 上传中心或者后台中心 上传 Ps:后台是后台 权限是权限 (3) 会员中心 (4) 白盒 基本函数定义 写前端的 Enctype 上传类型Method 提交方式Onsubmit 鼠标的时间Action"放在指定文件"Php 接受表单数据 isset(…...

C++设计模式(更新中)

文章目录 1、创建型模式1.1 简单工厂&#xff08;Simple Factory&#xff09;&#xff08;1&#xff09;示例&#xff08;2&#xff09;总结 1.2 工厂方法&#xff08;Factory Method&#xff09;&#xff08;1&#xff09;示例&#xff08;2&#xff09;总结 1.3 抽象工厂&…...

Kali crunsh字典工具

查看自带密码字典 vim /usr/share/wordlists 使用 crunch 字典工具 随机组成6位纯数字密码 crunch 6 6 0123456789 -o test1.txt 由 Abc1234 随机组成的 6~8 位密码 crunch 6 8 Abc1234 -o test2.txt 以A开头后面跟3位数字组成的4位密码 crunch 4 4 -t A%%% -o test3.txt...

Redis系列---Redission分布式锁

文章目录 类型原理使用看门狗与setNx比较 类型 使用Redission&#xff0c;lock的机制其实是使用了ttl&#xff0c;一直等ttl为0再get。无论是redission还是redis的setNx&#xff0c;只要是锁&#xff0c;都必须有加锁和释放锁两个动作&#xff0c;二者缺一不可&#xff0c;并且…...

算法打卡:第十一章 图论part05

今日收获&#xff1a;并查集理论基础&#xff0c;寻找存在的路径 1. 并查集理论基础&#xff08;from代码随想录&#xff09; &#xff08;1&#xff09;应用场景&#xff1a;判断两个元素是否在同一个集合中 &#xff08;2&#xff09;原理讲解&#xff1a;通过一个一维数组…...

3.《DevOps》系列K8S部署CICD流水线之部署MetalLB负载均衡器和Helm部署Ingress-Nginx

架构 服务器IP服务名称硬件配置192.168.1.100k8s-master8核、16G、120G192.168.1.101k8s-node18核、16G、120G192.168.1.102k8s-node28核、16G、120G192.168.1.103nfs2核、4G、500G操作系统:Rocky9.3 后续通过K8S部署GitLab、Harbor、Jenkins 为什么使用MetalLB 当使用云平…...

MySQL:表的约束

目录 1 空属性 2 默认值 3 列描述 4 zerofill 5 主键 6 自增长 7 唯一键 8 外键 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据的正确性。比如有…...

38.重复的子字符串

方法1&#xff1a; class Solution {public boolean repeatedSubstringPattern(String s) {if (s.equals("")) return false;String s2(ss).substring(1,(ss).length()-1);//去掉首尾字符return s2.contains(s);//判断是否包含s} } class Solution(object):def rep…...

Linux服务部署指南

在现代的IT基础设施中&#xff0c;Linux操作系统因其稳定性、安全性和灵活性而广泛用于服务部署。本文将提供一个全面的指南&#xff0c;介绍如何在Linux环境下部署服务&#xff0c;包括准备工作、部署流程、以及监控和维护。 1. 准备工作 在开始部署服务之前&#xff0c;确保…...

Unity中,如果你想让多个数字人轮流显示和隐藏

在Unity中&#xff0c;如果你想让多个数字人轮流显示和隐藏&#xff0c;可以通过控制它们的GameObject的激活状态 (SetActive()) 来实现。你可以创建一个简单的脚本来控制这些数字人的显示和隐藏&#xff0c;使用协程或者定时器来处理轮流的效果。 下面是一个基本的实现思路&a…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...