流式布局实现热搜和历史搜索

android搜索热词(热门标签)流式布局的实现 很多时候需要用到流式布局。比如搜索的activity里有很多搜索热词。这种自定义布局的实现。 立即下载

最近项目中在做热搜和历史搜索记录,开始是将横屏平均分成三份进行显示,后来需求说像个豆腐块,太难看了,要求是按着搜索输入的字的多少进行显示,就想天猫APP历史搜索那样的效果进行显示,其实这样的效果不用我们去写,可以在网上找一些想过资料,我在github上找了个,不能用,我一直怀疑是我这边使用方法出错了,但是检查了几遍也没找到错误,所以我又找了个,成功!!所以是控件出现问题。

下面是正确的控件

public class FlowLayout extends ViewGroup {
    public FlowLayout(Context context) {
        super(context);
    }

    public FlowLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FlowLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * 父容器生成 子view 的布局LayoutParams;
     * 一句话道出LayoutParams的本质:LayoutParams是Layout提供给其中的Children使用的。
     * 如果要自定义ViewGroup支持子控件的layout_margin参数,则自定义的ViewGroup类必须重载generateLayoutParams()函数,
     * 并且在该函数中返回一个ViewGroup.MarginLayoutParams派生类对象,这样才能使用margin参数。
     */
    @Override
    protected LayoutParams generateLayoutParams(
            LayoutParams p)
    {
        return new MarginLayoutParams(p);
    }

    @Override
    public LayoutParams generateLayoutParams(AttributeSet attrs)
    {
        return new MarginLayoutParams(getContext(), attrs);
    }

    @Override
    protected LayoutParams generateDefaultLayoutParams()
    {
        return new MarginLayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.MATCH_PARENT);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int measureWidth = MeasureSpec.getSize(widthMeasureSpec);
        int measureHeight = MeasureSpec.getSize(heightMeasureSpec);
        int measureWidthMode = MeasureSpec.getMode(widthMeasureSpec);
        int measureHeightMode = MeasureSpec.getMode(heightMeasureSpec);


        int lineWidth = 0;
        int lineHeight = 0;
        int height = 0;
        int width = 0;
        int count = getChildCount();
        for (int i=0;i<count;i++){
            View child = getChildAt(i);
            measureChild(child,widthMeasureSpec,heightMeasureSpec);
            //如果忘记重写generateLayoutParams,则hild.getLayoutParams()将不是MarginLayoutParams的实例
            //在强制转换时就会出错,此时我们把左右间距设置为0,但由于在计算布局宽高时没有加上间距值,就是计算出的宽高要比实际小,所以是onLayout时就会出错
            MarginLayoutParams lp = null;
            if (child.getLayoutParams() instanceof MarginLayoutParams) {
                lp = (MarginLayoutParams) child
                        .getLayoutParams();
            }else{
                lp = new MarginLayoutParams(0,0);
            }
            int childWidth = child.getMeasuredWidth() + lp.leftMargin +lp.rightMargin;
            int childHeight = child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;

            if (lineWidth + childWidth > measureWidth){
                //需要换行
                width = Math.max(lineWidth,width);
                height += lineHeight;
                //因为由于盛不下当前控件,而将此控件调到下一行,所以将此控件的高度和宽度初始化给lineHeight、lineWidth
                lineHeight = childHeight;
                lineWidth = childWidth;
            }else{
                // 否则累加值lineWidth,lineHeight取最大高度
                lineHeight = Math.max(lineHeight,childHeight);
                lineWidth += childWidth;
            }

            //最后一行是不会超出width范围的,所以要单独处理
            if (i == count -1){
                height += lineHeight;
                width = Math.max(width,lineWidth);
            }

        }
        //当属性是MeasureSpec.EXACTLY时,那么它的高度就是确定的,
        // 只有当是wrap_content时,根据内部控件的大小来确定它的大小时,大小是不确定的,属性是AT_MOST,此时,就需要我们自己计算它的应当的大小,并设置进去
        setMeasuredDimension((measureWidthMode == MeasureSpec.EXACTLY) ? measureWidth
                : width, (measureHeightMode == MeasureSpec.EXACTLY) ? measureHeight
                : height);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int count = getChildCount();
        int lineWidth = 0;
        int lineHeight = 0;
        int top=0,left=0;
        for (int i=0; i<count;i++){
            View child = getChildAt(i);
            MarginLayoutParams lp = (MarginLayoutParams) child
                    .getLayoutParams();
            int childWidth = child.getMeasuredWidth()+lp.leftMargin+lp.rightMargin;
            int childHeight = child.getMeasuredHeight()+lp.topMargin+lp.bottomMargin;

            if (childWidth + lineWidth >getMeasuredWidth()){
                //如果换行,当前控件将跑到下一行,从最左边开始,所以left就是0,而top则需要加上上一行的行高,才是这个控件的top点;
                top += lineHeight;
                left = 0;
                //同样,重新初始化lineHeight和lineWidth
                lineHeight = childHeight;
                lineWidth = childWidth;
            }else{
                lineHeight = Math.max(lineHeight,childHeight);
                lineWidth += childWidth;
            }
            //计算childView的left,top,right,bottom
            int lc = left + lp.leftMargin;
            int tc = top + lp.topMargin;
            int rc =lc + child.getMeasuredWidth();
            int bc = tc + child.getMeasuredHeight();
            child.layout(lc, tc, rc, bc);
            //将left置为下一子控件的起始点
            left+=childWidth;
        }

    }


}


使用和普通的自定义控件一样

<com.FlowLayout
    android:id="@+id/ll_history"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    >

        <TextView
            android:id="@+id/tv_text1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="4dp"
            android:background="@drawable/hotsearch_bg"
            android:gravity="center"
            android:textSize="14sp"


            />

        <TextView
            android:id="@+id/tv_text2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="4dp"
            android:background="@drawable/hotsearch_bg"
            android:gravity="center"
            android:textSize="14sp"
            />

</com.FlowLayout>

有需要的时候可以直接拿来用

FillView热门搜索词控件 立即下载

相关推荐

baidu-hot-search:百度实时热搜,小时更新,按天重构。Python实现

百度热搜 灵感来源,ts实现的微博热搜榜 ,感谢大佬的思路〜 百度实时热搜,记录从2020-12-09 14:02:03开始的百度实时热搜。每小时抓取一次数据,按天。Python实现。 相关项目 今日热门搜索 最后更新时间2021-02-08 04:18:59 4904649 4732986 4567332 4407475 4253213 4104351 3960699 3822074 3688301 传言3559211 3434639 3314426 3198421 声明3086476 2978450 2874204 2809361 2773607 2676531 2582852 2492452 胖2342081 2268670 2260108 2181005 2104669 2031006 1959921 1891323 1

Java、redis、springboot、ruoyi实现热搜及最近搜索

java实现最近搜索,热门搜索

qq_41060647的博客 2402

Linux下安装FastDFS及生成缩略图

1. 安装编译环境 yum install git gcc gcc-c++ make automake vim wget libevent -y 2. 安装libfastcommon基础库 mkdir /root/fastdfs cd /root/fastdfs git clone https://github.com/happyfish100/libfastcommon.git --depth 1 cd libfastcommon/ ./make.sh && ./make.sh ins

weixin_45234710的博客 1373

Java 使用 Redis 实现微博热搜功能

在实现热搜功能时,Redis 提供的SortedSet(有序集合)是非常合适的。SortedSet:是一个有序的集合,每个元素都有一个分数(score),Redis 会自动根据分数对元素进行排序。适合实现需要排序的场景,如热搜榜单、排行榜等。通过以上的实现,我们展示了如何使用Java和Redis来实现一个简单的微博热搜功能。通过 Redis 的有序集合,我们能够高效地记录和排序搜索关键词的热度,并在用户请求时实时返回当前最热门的话题。

w_l666的博客 1675

决策大模型与生成式大模型有何不同?一文拆解技术框架与落地路径

大模型技术正从内容生成走向复杂场景的智能决策。与生成式大模型拟合概率分布不同,决策大模型以序列决策为核心,融合强化学习机制,在动态环境中感知反馈、持续修正行动路径。其技术框架涵盖语义理解、规划推理与闭环决策,并通过世界模型进行低成本仿真推演,显著提升供应链调度、物流排程等场景的应对效率。实际落地时需结合传统优化算法与人工兜底,构建“语义先导+数值寻优”的分层架构,才能平衡精度与稳定性。这篇内容拆解决策大模型的技术组成、落地路径与常见误区,为企业智能化转型提供可参考的实践框架。

weixin_29057163的博客 188

STM32CubeMX平台F4系列固件下载核心要点

详解STM32CubeMX平台下F4系列单片机的固件包下载方法与常见问题,重点讲解stm32cubemx固件包下载流程及配置技巧,帮助开发者快速完成开发环境搭建。

weixin_42575505的博客 892

Android 流式布局FlowLayout(搜索历史)

使用方法 将libray模块复制到项目中,或者直接在build.gradle中依赖: allprojects { repositories { maven { url 'https://jitpack.io' } } } dependencies { compile 'com.github.AnJiaoDe:MultiFlowLayout:V1.1.2' } &lt.

weixin_43897285的博客 500

IDEA集成selenium自动化测试(Java+Selenuim+testNG+Maven)

文章目录写在前面01 | 新建Maven项目02 | idea集成Selenium03 | 写在前面 因为软件测试的需求和博主比较经常使用Java,于是,想在Idea中集成selenuim,用Java编写测试代码,因此有了这篇文章来记录一下过程。 资源指路: java使用selenium实现模拟浏览器操作API大全 模拟登录 TestNG入门教程 感谢上面博客的大佬。 01 | 新建Maven项目 不使用骨架创建,直接点击左侧Maven,然后一路next即可。 02 | idea集成Sele

aLinxi的博客 8279

安卓自定义布局显示流式搜索记录

安卓自定义布局显示流式搜索记录 老规矩,先上效果图(环境:API 30 , AS 4.0) OKK,开始动手! 第一步:自定义流式布局 XFlowLayout ,继承ViewGroup,然后重写 onMeasure()和onLayout()方法 import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; import and

C_biubiubiu的博客 537

AUTOSAR从入门到精通-【自动驾驶】特斯拉全自动驾驶(FSD)

特斯拉全自动驾驶系统(Full-Self Driving,简称FSD)是特斯拉公司开发的高级驾驶辅助系统,旨在通过神经网络技术实现环境感知与车辆控制,在驾驶员监督下完成导航、转向、变道、泊车等操作。‌ 该系统自2021年发布Beta测试版以来持续迭代,最新版本为2025年10月推出的v14版本。‌FSD v14版本基于端到端神经网络架构,取代了传统代码逻辑,通过数百万视频片段训练模型,以模仿人类驾驶决策。‌ 其功能覆盖住宅区街道、城市道路及高速公路,支持交通信号识别、自动变道和环岛通行等场景。

getusushu的博客 570

某城商银行生产容器云平台详细设计方案分享及经验总结

AS3模式的CIS容器部署在K8S集群内,作为F5的控制器,CIS容器通过对K8S集群内Configmap资源进行监控,将Configmap资源中的内容转化为F5的配置,将配置推送给 F5 ,CIS容器还通过K8S标准的API接口完成业务发现和实时监听集群内Pod的变化,一旦Pod发生变化,相应的更新会及时推送给F5,并完成更新。容器技术发展非常迅速,现在应用大多以容器作为承载介质,前两年在容器云上承载的应用类型主要是Web类,随着容器云领域的不断发展,越来越多的应用类型将迁移至容器云,包括有状态应用。

qq_61890005的博客 856

Android流式布局(搜索历史)

1.导依赖 implementation 'com.hyman:flowlayout-lib:1.1.2' 2.布局 &amp;amp;amp;lt;?xml version=&amp;amp;quot;1.0&amp;amp;quot; encoding=&amp;amp;quot;utf-8&amp;amp;quot;?&amp;amp;amp;gt; &amp;amp;amp;lt;LinearLayout xmlns:android

qq_43040588的博客 660

【忍者算法】从拼积木到最长连续序列:一道别出心裁的数组题目|LeetCode 128 最长连续序列

本题核心:通过预处理数据结构来优化查找!

忍者算法的博客 738

WanAndroid(鸿蒙版)开发的第三篇

WanAndroid(鸿蒙版)开发的第三篇:实现搜索和搜索详情显示效果

Abner_Crazy的博客 967

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

首先流式布局搜索框

依赖implementation 'com.hjm:BottomTabBar:1.1.1' //okhttp implementation 'com.squareup.okhttp3:okhttp:3.5.0' //gson implementation 'com.google.code.gson:gson:2.6.2' //glide implem...

qq_40857831的博客 552

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

京东搜索页面

页面布局 xml version="1.0" encoding="utf-8"?> LinearLayout android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.co

Zyy_921的博客 683

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

android 搜索历史流布局,FlowLayout流式布局实现搜索清空历史记录

本文实例为大家分享了FlowLayout实现搜索清空历史记录的具体代码,供大家参考,具体内容如下效果图:点击搜索框将搜索的历史在流式布局中展示出来,清空历史记录就会将历史清空,每次搜索后都存入sp中,每次进入页面都先判断sp里是否有值并展示首先需要导入一个module,下载地址下载完这个工程后,需要将里面的flowlayout-lib导入到工程中,导入工程的步骤:File - New - Impo...

weixin_35461942的博客 418

flutter 搜索组件,带流式布局搜索记录

流式布局wrap,flutter中文网 代码: import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:monitor/common/style/style_custom.dart'; class DeviceSearchPage ex...

晓风残叶 1896

FlowLayout流式布局实现搜索清空历史记录

效果图:点击搜索框将搜索的历史在流式布局中展示出来,清空历史记录就会将历史清空,每次搜索后都存入sp中,每次进入页面都先判断sp里是否有值并展示首先需要导入一个module,下载地址:https://github.com/zhangliyong114/FlowLayoutDemo下载完这个工程后,需要将里面的flowlayout-lib导入到工程中,导入工程的步骤:File - New - Imp...

zuimeirensheng的博客 1264

android自定义搜索记录,Android流式布局实现历史搜索记录功能

最近在开发项目的时候,有一个需求是展示历史搜索记录 ,展示的样式是流式布局(就是根据内容自动换行)。在网上看到了一个不错的类库跟大家分享一下首先在AndroidStudio简历一个工程项目导入module类库,我会把项目demo方法GitHub上说一下demo中的实现方式在 activity_main.xml中xmlns:app="http://schemas.android.com/apk/re...

weixin_42422648的博客 452

Android第三方流式布局FlowLayout简单实用(搜索历史记录)

效果图: 导入大Model下: maven { url 'https://jitpack.io' } builde.gradle依赖: implementation 'com.github.LRH1993:AutoFlowLayout:1.0.5' 布局文件: <RelativeLayout xmlns:android="http://schemas.and...

_万能的博哥的博客 1807

搜索栏+流式布局+数据库

要求:自定义View实现搜索控件;流式布局;sqlite数据库 总的效果图: //一.布局 1.搜索栏的展示: &lt;?xml version="1.0" encoding="utf-8"?&gt; LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android” android:layout_width=“matc...

qq_43603312的博客 1591

流式布局_历史搜索

流式布局_历史搜索 public class Flow_Layout extends FrameLayout { private int space = 20; public Flow_Layout(Context context) { super(context); } public Flow_Layout(Context context, AttributeSet attrs) {...

Jang_AnGe的博客 207

Android流式布局实现历史搜索记录

最近在开发项目的时候,有一个需求是展示历史搜索记录 ,展示的样式是流式布局(就是根据内容自动换行)。在网上看到了一个不错的类库跟大家分享一下 首先在AndroidStudio简历一个工程项目导入module类库,我会把项目demo方法GitHub上 说一下demo中的实现方式在 activity_main.xml中<?xml version="1.0" encoding="utf-8"?> <L

zhang_li_yong的博客 2426
上一篇: ListView 图片丢失,错位
下一篇: androidstudio 获取百度地图开发版SHA1值
android_yck
博客等级 码龄10年 18粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值