列表吸顶分组之按首字母分组国家选区号

列表粘性分组之按首字母分组国家选区号

Android原生版本

直接先看UI图,效果如下

在这里插入图片描述
本来看起来也不难,我就想着上面常用区号那块不动,下面的列表滑动就行,但IOS说他滑动的时候上面也滑上去了,好吧,这也行;但最终效果做出来后,IOS滑动后会有按照国家名称首字母进行粘性分组,好吧,为了提升自己,我也决定做得跟IOS一样,不说废话了,直接上代码
引入流布局控件

//流布局
api 'com.google.android:flexbox:1.0.0'

布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:id="@+id/rl_content"android:layout_width="match_parent"android:layout_height="@dimen/dp_area_code_pop_height"app:defaultColor="@color/white"app:topLeftRadius="@dimen/dp_10"app:topRightRadius="@dimen/dp_10"tools:background="@color/white"><TextViewandroid:id="@+id/tv_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_gravity="center"android:paddingVertical="@dimen/dp_20"android:text="@string/sel_international_code"android:textColor="@color/col_3a3b3d"android:textSize="@dimen/sp_18" /><com.yunqu.quyun_res.widget.StatusLayoutandroid:id="@+id/status"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/tv_title"app:status="LOADING"app:toolsStatus="NORMAL"><ProgressBarstyle="?android:attr/progressBarStyleSmall"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"app:layout_status="LOADING" /><FrameLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"app:layout_status="NORMAL"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rv_general"android:background="@color/white"android:layout_width="match_parent"android:layout_height="wrap_content"android:paddingHorizontal="@dimen/dp_20"android:paddingVertical="@dimen/dp_10"tools:itemCount="4"tools:listitem="@layout/item_general_code" /></FrameLayout></com.yunqu.quyun_res.widget.StatusLayout><Viewandroid:id="@+id/v_divider"android:layout_width="match_parent"android:layout_height="@dimen/dp_0_5"android:layout_above="@id/tv_cancel"android:background="@color/col_e0e7ee" /><Buttonandroid:id="@+id/tv_cancel"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:background="@color/white"android:gravity="center"android:paddingVertical="@dimen/dp_17"android:text="@string/cancel"android:textColor="@color/col_3a3b3d"android:textSize="@dimen/sp_16"app:textPressedColor="@color/col_acb2b8" /><com.yunqu.quyun_res.widget.TenXuLetterBarandroid:id="@+id/txlb"android:layout_width="@dimen/dp_15"android:layout_height="wrap_content"android:layout_below="@id/tv_title"android:layout_alignBottom="@id/v_divider"android:layout_alignParentEnd="true"android:layout_marginTop="@dimen/dp_70"android:layout_marginEnd="@dimen/dp_20"android:layout_marginBottom="@dimen/dp_10"android:minHeight="@dimen/dp_area_code_mh"app:txlb_item_background_def="@drawable/bg_letter_def"app:txlb_item_background_sel="@drawable/bg_letter_sel"app:txlb_item_text_color_def="@color/col_9b9b9b"app:txlb_item_text_color_sel="@color/white" /><TextViewandroid:id="@+id/tv_letter"android:layout_width="@dimen/dp_55"android:layout_height="@dimen/dp_55"android:layout_centerInParent="true"android:layout_gravity="center"android:background="@drawable/bg_circle_80000000"android:gravity="center"android:textColor="@color/white"android:textSize="18sp"android:visibility="gone"tools:visibility="visible" /></RelativeLayout>

item_common_code.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:paddingBottom="@dimen/dp_10"tools:ignore="MissingDefaultResource"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rv_commons"android:layout_width="match_parent"android:layout_height="wrap_content"android:nestedScrollingEnabled="false"tools:itemCount="2"tools:listitem="@layout/item_common_code" /></FrameLayout>

item_common_code_tip.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"tools:ignore="MissingDefaultResource"><TextViewandroid:id="@+id/tv_common_tip"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/common_code"android:textColor="@color/col_9b9b9b"android:textSize="@dimen/sp_14" /></FrameLayout>

item_general_code.xml

<?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"><TextViewandroid:id="@+id/tv_code"android:layout_width="match_parent"android:layout_height="wrap_content"android:paddingVertical="@dimen/dp_12"android:includeFontPadding="false"android:textColor="@color/col_111212"android:textSize="@dimen/sp_14"tools:text="中国大陆+86" /></LinearLayout>

item_general_code_group.xml

<?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"tools:ignore="MissingDefaultResource"><LinearLayoutandroid:id="@+id/ll_letter"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"tools:ignore="UselessParent"><TextViewandroid:id="@+id/tv_letter"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@color/col_111212"android:textSize="@dimen/sp_14"android:textStyle="bold"tools:text="A" /><Viewandroid:layout_width="match_parent"android:layout_height="@dimen/dp_0_5"android:layout_marginTop="@dimen/dp_10"android:background="@color/col_e0e7ee" /></LinearLayout></LinearLayout>

其中com.yunqu.quyun_res.widget.StatusLayout控件是自定义的一个FrameLayout状态控件,这里就不放出来了,其实主要就是控制加载数据过程中的切换,根据逻辑用GONE和VISIBLE也是一样的

com.yunqu.quyun_res.widget.TenXuLetterBar控件代码如下

public class TenXuLetterBar extends View {private static final String TAG = "TenXuLetterBar";//    private final List<String> mLetters = new ArrayList<>();private final String[] mLettersHadWell = new String[]{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "#"};private final String[] mLetters = new String[]{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};private final Paint mPaint;private Drawable mItemBackgroundDef;private Drawable mItemBackgroundSel;private final int mItemTextColorDef;private final int mItemTextColorSel;private final boolean mNeedWell;//    private int mLetterWidth;private int mLetterIndex = -1;private OnLetterChangeListner onLetterChangeListener;//选中字母后的回调public TenXuLetterBar(Context context) {this(context, null);}public TenXuLetterBar(Context context, AttributeSet attrs) {this(context, attrs, 0);}public TenXuLetterBar(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);TypedArray typedArray =context.obtainStyledAttributes(attrs, R.styleable.TenXuLetterBar);mItemBackgroundDef = typedArray.getDrawable(

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

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

相关文章

低代码:数智化助力新农业发展

随着科技的飞速发展和数字化转型的深入推进&#xff0c;低代码开发平台正逐渐成为软件开发的热门话题。尤其在农业领域&#xff0c;低代码技术为传统农业注入了新的活力&#xff0c;助力新农业实现高效、智能的发展。 低代码开发平台的概念与特点 随着科技的飞速发展&#xff0…

基于springboot的精品在线试题库系统设计与实现(程序+数据库+文档)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 目录 一、研…

广东工行客户在手机银行上进行医保查询

现在的手机银行功能越来越多&#xff0c;对于一些不常用的功能&#xff0c;更是不知道该在哪里找到及访问&#xff0c;像医保查询&#xff0c;我原来就不知道怎么访问&#xff0c;问了别人才知道&#xff0c;特记录一下&#xff0c;以方便下次要访问时能找到。 1、从 手机银行…

考勤签到作业表单周期打卡评分小程序开发

表单考勤签到作业周期打卡评分小程序开源版开发 这是一款功能丰富的自定义表单统计小程序&#xff0c;涵盖信息填表、预约报名、签到打卡、活动通知、报名投票以及班级统计等多项功能。 高度灵活与自定义 该小程序为用户提供高度灵活的自定义表单系统。正文描述字段包含文本…

JSP语言基础(案例代码)

JSP基本语法 编写一个JSP页面&#xff0c;在该页面中显示当前时间 <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" import"java.util.*"%> <% page import"java.text.SimpleDateF…

马蹄集 开学季活动赛

目录 最大的平均值 门票 二阶前缀和 最大异或和 背军理 信号灯 切蛋糕 矩形 矩阵01变 运动会进行中 三连 距离平方和 最大的平均值 黄金时间限制:1秒巴 占用内存:128 M少难度: 给一个数组&#xff0c;长度为n&#xff0c;找一个长度大于等于m的子区间&#xff0c;使…

【Redis】redis的基本使用

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Redis ⛺️稳中求进&#xff0c;晒太阳 Redis的概述 为什么要有redis? redis是数据库&#xff0c;mysql也是数据库&#xff0c;redis做缓存的意义就是为了减轻数据库压力 数据库为什么…

微信公众号公司主体变更怎么办?

公众号迁移的好处有哪些&#xff1f;迁移后原公众号还能用吗&#xff1f;1&#xff09;获得更多权限功能如果公众号是个人主体&#xff0c;想进行认证&#xff0c;拥有更多权限功能。例如菜单栏跳转外部链接&#xff0c;相拥有留言功能&#xff0c;服务号认证获得开发权限等。就…

平台总线式驱动开发

一、总线、设备、驱动 硬编码式的驱动开发带来的问题&#xff1a; 垃圾代码太多 结构不清晰 一些统一设备功能难以支持 开发效率低下 1.1 初期解决思路&#xff1a;设备和驱动分离 struct device来表示一个具体设备&#xff0c;主要提供具体设备相关的资源&#xff08;如…

openEuler系统远程SSH远程连接

文章目录 1. 本地SSH连接测试2. openEuler安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 欧拉操作系统(openEuler, 简称“欧拉”)是面向数字基础设施的操作系统,支持服务器、云计算、边缘openEuler是面向数字基础设施的操作系…

基于51单片机的心率体温检测系统设计

目 录 摘 要 I Abstract II 引 言 1 1 控制系统设计 2 1.1 主控系统方案设计 2 1.2 脉搏传感器方案设计 3 1.3 系统工作原理 5 2 硬件设计 6 2.1 主电路 6 2.1.1 单片机的选择 6 2.1.2 STC89C51的主要功能及性能参数 6 2.1.3 STC89C51单片机引脚说明 6 2.2 驱动电路 8 2.2.1 比…

第八篇 - 预测受众(Predictive audience)技术是如何赋能数字化营销生态的?- 我为什么要翻译介绍美国人工智能科技巨头IAB公司

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先后为700多家媒…

基于springboot+vue的政府管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

2024BAT大厂Android社招面试题,OMG,学它

开头 中国互联网发展的这些年&#xff0c;如今90后程序员是中国程序员的主力军&#xff0c;互联网的热潮也让一批批00后蠢蠢欲动&#xff0c;尝试涌入互联网圈。 当程序员容易&#xff0c;当一个优秀的程序员需要不断学习&#xff0c;从初级程序员到高级程序员&#xff0c;从…

【NR 定位】3GPP NR Positioning 5G定位标准解读(三)

目录 前言 5 NG-RAN UE定位架构 5.1 架构 5.2 UE定位操作 5.3 NG-RAN定位操作 5.3.1 通用NG-RAN定位操作 5.3.2 OTDOA定位支持 5.3.3 广播辅助信息支持 5.3.4 NR RAT相关定位支持 5.4 NG-RAN中与UE定位相关的元素功能描述 5.4.1 用户设备&#xff08;UE&#xff09; …

蓝桥杯嵌入式省赛模板构建——测量两路频率和占空比

结合测量一路PWM频率编程 测量占空比&#xff1a;测量高电平持续时间和周期 思路&#xff1a; ①.第一次上升沿中断&#xff0c;清零计数器&#xff0c;开始计时并改成下降沿中断 ②.下降沿中断&#xff0c;获取计数值T1&#xff0c;并改为上升沿中断 ③.第二次上升沿中断…

小猫挑食不吃猫粮是为什么?排行榜靠前适口性好的生骨肉冻干分享

现在的猫咪主人都把自家的小猫当成了心头的宝贝&#xff0c;呵护备至。但宠爱过度有时会导致猫咪形成挑食的坏习惯。小猫挑食不吃猫粮是为什么呢&#xff1f;面对这一问题&#xff0c;我们应该如何解决呢&#xff1f; 今天&#xff0c;我给大家剖析一下小猫挑食不吃猫粮是为什…

青少年软件编程图形化编程等级考试二级模拟测试

青少年软件编程图形化编程等级考试二级模拟测试 第 1 题 【单选题】 下面积木块的执行结果是&#xff1f;&#xff08; &#xff09; A :香蕉苹果 B :香蕉和苹果 C :香苹 D :香果 正确答案:D 试题解析: 第 2 题 【单选题】 执行下面的指令后&#xff0c; 舞台上的小…

ActivityRecordInputSink深入剖析全网独家分析

背景&#xff1a; 学员粉丝朋友们在学习马哥的android framework实战高级课程时候&#xff0c;有一些细心的学员提出了一个无问题&#xff0c;那就是再看dumpsys SurfaceFlinger的图层或者是dumpsys input相关信息时候发现了一个叫做ActivityRecordInputSink的图层。 如下图所…

OWASP Top 10 网络安全10大漏洞——A02:A02:2021-加密机制失效

10大Web应用程序安全风险 2021年top10中有三个新类别、四个类别的命名和范围变化&#xff0c;以及一些合并。 A02&#xff1a;A02:2021-加密机制失效 上升一个位置&#xff0c;当前top2&#xff0c;以前称为敏感数据泄露&#xff0c;是一种状况而不是根本原因。更新后的类别…