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

安卓实现左右布局聊天界面

先看效果图。是不是你们想要的。大概就是这样的效果Android 实现左右布局聊天界面好友左、自己右采用 RecyclerView 双布局 Item 实现结构清晰、可直接复用适配聊天气泡样式。一、整体思路两种 Item 布局item_msg_left.xml对方消息居左item_msg_right.xml自己消息居右消息实体类记录消息内容、发送者类型RecyclerView 适配器根据类型加载不同布局气泡背景自带圆角、区分左右样式二、1. 消息实体类 MsgBeanpublicclassMsgBean{// 消息文本privateStringcontent;// 0对方消息(左) 1自己消息(右)privateintmsgType;publicMsgBean(Stringcontent,intmsgType){this.contentcontent;this.msgTypemsgType;}// getter setterpublicStringgetContent(){returncontent;}publicintgetMsgType(){returnmsgType;}}三、2. 左边 Item 布局对方消息item_msg_left.xml?xml version1.0encodingutf-8?LinearLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:padding10dpandroid:gravityleftTextViewandroid:idid/tv_msgandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:padding10dpandroid:maxWidth250dpandroid:textColor#333333android:backgrounddrawable/bg_msg_left//LinearLayout右边 Item 布局自己消息item_msg_right.xml?xml version1.0encodingutf-8?LinearLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:padding10dpandroid:gravityrightTextViewandroid:idid/tv_msgandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:padding10dpandroid:maxWidth250dpandroid:textColor#FFFFFFandroid:backgrounddrawable/bg_msg_right//LinearLayout四、4. 气泡背景 drawablebg_msg_left.xml左侧灰色气泡?xml version1.0encodingutf-8?shape xmlns:androidhttp://schemas.android.com/apk/res/androidsolid android:color#E5E5E5/corners android:topLeftRadius5dpandroid:topRightRadius15dpandroid:bottomLeftRadius15dpandroid:bottomRightRadius15dp//shapebg_msg_right.xml右侧蓝色气泡?xml version1.0encodingutf-8?shape xmlns:androidhttp://schemas.android.com/apk/res/androidsolid android:color#0099FF/corners android:topLeftRadius15dpandroid:topRightRadius5dpandroid:bottomLeftRadius15dpandroid:bottomRightRadius15dp//shape五、5. RecyclerView 适配器 MsgAdapterimportandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.TextView;importandroidx.annotation.NonNull;importandroidx.recyclerview.widget.RecyclerView;importjava.util.List;publicclassMsgAdapterextendsRecyclerView.AdapterRecyclerView.ViewHolder{privatefinalListMsgBeanmsgList;// 区分两种布局类型privatestaticfinalintTYPE_LEFT0;privatestaticfinalintTYPE_RIGHT1;publicMsgAdapter(ListMsgBeanmsgList){this.msgListmsgList;}// 根据消息类型返回布局OverridepublicintgetItemViewType(intposition){returnmsgList.get(position).getMsgType();}NonNullOverridepublicRecyclerView.ViewHolderonCreateViewHolder(NonNullViewGroupparent,intviewType){if(viewTypeTYPE_LEFT){ViewviewLayoutInflater.from(parent.getContext()).inflate(R.layout.item_msg_left,parent,false);returnnewLeftHolder(view);}else{ViewviewLayoutInflater.from(parent.getContext()).inflate(R.layout.item_msg_right,parent,false);returnnewRightHolder(view);}}OverridepublicvoidonBindViewHolder(NonNullRecyclerView.ViewHolderholder,intposition){MsgBeanbeanmsgList.get(position);if(holderinstanceofLeftHolder){((LeftHolder)holder).tvMsg.setText(bean.getContent());}elseif(holderinstanceofRightHolder){((RightHolder)holder).tvMsg.setText(bean.getContent());}}OverridepublicintgetItemCount(){returnmsgList.size();}// 左边ViewHolderstaticclassLeftHolderextendsRecyclerView.ViewHolder{TextViewtvMsg;publicLeftHolder(NonNullViewitemView){super(itemView);tvMsgitemView.findViewById(R.id.tv_msg);}}// 右边ViewHolderstaticclassRightHolderextendsRecyclerView.ViewHolder{TextViewtvMsg;publicRightHolder(NonNullViewitemView){super(itemView);tvMsgitemView.findViewById(R.id.tv_msg);}}// 添加消息 自动滚动到底部publicvoidaddMsg(MsgBeanbean){msgList.add(bean);notifyItemInserted(msgList.size()-1);}}六、6. 主界面布局 activity_chat.xml?xml version1.0encodingutf-8?LinearLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationvertical!--聊天列表--androidx.recyclerview.widget.RecyclerViewandroid:idid/recycler_chatandroid:layout_widthmatch_parentandroid:layout_height0dpandroid:layout_weight1/!--输入栏--LinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:orientationhorizontalandroid:padding8dpEditTextandroid:idid/et_inputandroid:layout_width0dpandroid:layout_heightwrap_contentandroid:layout_weight1android:hint输入消息/Buttonandroid:idid/btn_sendandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text发送//LinearLayout/LinearLayout七、7. 聊天 Activity 逻辑 ChatActivity.javaimportandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroidx.appcompat.app.AppCompatActivity;importandroidx.recyclerview.widget.LinearLayoutManager;importandroidx.recyclerview.widget.RecyclerView;importjava.util.ArrayList;importjava.util.List;publicclassChatActivityextendsAppCompatActivity{privateRecyclerViewrecyclerChat;privateEditTextetInput;privateMsgAdaptermsgAdapter;privateListMsgBeanmsgList;OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_chat);recyclerChatfindViewById(R.id.recycler_chat);etInputfindViewById(R.id.et_input);ButtonbtnSendfindViewById(R.id.btn_send);// 初始化列表msgListnewArrayList();msgAdapternewMsgAdapter(msgList);LinearLayoutManagerlayoutManagernewLinearLayoutManager(this);recyclerChat.setLayoutManager(layoutManager);recyclerChat.setAdapter(msgAdapter);// 模拟对方默认消息msgAdapter.addMsg(newMsgBean(你好呀,0));// 发送按钮点击btnSend.setOnClickListener(v-{StringcontentetInput.getText().toString().trim();if(!content.isEmpty()){// 添加自己消息右msgAdapter.addMsg(newMsgBean(content,1));etInput.setText();// 自动滚动到底部recyclerChat.scrollToPosition(msgAdapter.getItemCount()-1);}});}}效果说明1.好友消息左侧灰色气泡2.自己消息右侧蓝色气泡3.发送消息自动滚到底部4.消息最大宽度限制长文本自动换行八、软键盘弹出自动上移聊天列表安卓聊天界面必备默认情况下弹出输入法键盘时RecyclerView 聊天列表不会往上顶输入框会被键盘遮挡、最新消息被键盘盖住看不到。软键盘弹起 → 整个聊天布局自动上移最新消息自动显示在键盘上方不会被遮挡AndroidManifest.xml 配置最简单一行搞定找到你的 ChatActivity 对应的 activity 标签添加属性android:windowSoftInputModeadjustResize完整示例activityandroid:name.ChatActivityandroid:windowSoftInputModeadjustResize/activity

相关文章:

安卓实现左右布局聊天界面

先看效果图。是不是你们想要的。大概就是这样的效果Android 实现左右布局聊天界面(好友左、自己右) 采用 RecyclerView 双布局 Item 实现,结构清晰、可直接复用,适配聊天气泡样式。 一、整体思路 两种 Item 布局: ite…...

Python项目上线即崩?90%团队忽略的分布式配置元数据治理——配置版本血缘、变更审计、灰度发布链路全曝光

更多请点击: https://intelliparadigm.com 第一章:Python项目上线即崩?90%团队忽略的分布式配置元数据治理——配置版本血缘、变更审计、灰度发布链路全曝光 当 Flask 服务在生产环境突然返回 500 错误,而本地和测试环境一切正常…...

告别虚拟机!手把手教你用Ubuntu 22.04双系统搭建RoboCup救援仿真环境(附ThinkBook网卡驱动修复)

告别虚拟机!手把手教你用Ubuntu 22.04双系统搭建RoboCup救援仿真环境(附ThinkBook网卡驱动修复) RoboCup救援仿真项目是人工智能与机器人领域的经典赛事平台,但环境搭建常让初学者望而生畏。虚拟机卡顿、驱动缺失、依赖冲突等问题…...

AS5600编码器避坑指南:STM32 HAL库I2C通信的稳定性调优与常见问题排查

AS5600编码器实战:STM32 HAL库I2C通信稳定性深度优化手册 1. I2C通信基础与AS5600特性解析 AS5600作为一款非接触式磁性旋转位置传感器,其I2C接口的稳定通信是确保角度测量精度的首要条件。在实际工程中,开发者常会遇到数据跳变、通信中断等问…...

在多轮对话场景下感受 Taotoken 对上下文长度的稳定支持

在多轮对话场景下感受 Taotoken 对上下文长度的稳定支持 1. 长上下文对话的典型场景 在代码调试或长文档分析等场景中,用户往往需要与模型进行多轮交互以保持上下文连贯性。例如,开发者可能上传一段复杂代码后,连续提出多个细化问题要求模型…...

告别迷茫!手把手教你用Isolar A/B配置Autosar应用软件层(从新建工程到SWC链接)

告别迷茫!手把手教你用Isolar A/B配置Autosar应用软件层(从新建工程到SWC链接) 第一次打开Isolar A/B时,那个布满专业术语的界面就像面对一堵密不透风的墙。作为过来人,我完全理解这种手足无措的感觉——明明每个单词都…...

新手零失败指南:在快马平台用ai生成你的第一个mysql安装实践项目

今天想和大家分享一个特别适合编程新手的MySQL安装教程。作为一个过来人,我深知第一次安装数据库时的手忙脚乱——环境变量、服务启动、密码设置,每一步都可能成为拦路虎。不过现在有了InsCode(快马)平台,整个过程变得轻松多了。 检查系统是…...

IPXWrapper终极指南:5分钟让经典游戏在现代Windows上重获联机能力

IPXWrapper终极指南:5分钟让经典游戏在现代Windows上重获联机能力 【免费下载链接】ipxwrapper 项目地址: https://gitcode.com/gh_mirrors/ip/ipxwrapper 还在为《星际争霸》《红色警戒2》《魔兽争霸2》等经典游戏无法在Windows 10/11上联机而烦恼吗&#…...

人工智能篇---TensorBoard 和 Weights Biases (WB)

一、为什么需要专门的训练可视化?—— 超越 print 的维度训练深度学习模型是一个在黑暗中摸索的过程。只看终端的损失值打印,会带来几个致命问题:维度灾难:无法同时追踪损失、准确率、学习率、梯度、权重分布、GPU 利用率等数十个…...

16.人工智能实战:大模型回答格式总是不稳定?JSON Schema 约束、重试修复与结构化输出完整方案

人工智能实战:大模型回答格式总是不稳定?JSON Schema 约束、重试修复与结构化输出完整方案一、问题场景:AI 回答内容对了,但系统解析失败 在很多 AI 应用中,模型不是只负责聊天,而是要输出结构化结果。 例如…...

实战应用:通过快马快速构建vmware虚拟机网络安全攻防靶场

实战应用:通过快马快速构建VMware虚拟机网络安全攻防靶场 在网络安全学习和实战演练中,搭建一个隔离的测试环境是必不可少的。VMware虚拟机因其稳定性和灵活性,成为搭建网络安全靶场的首选工具。但手动配置多台虚拟机、设置网络环境、安装工…...

手把手教你用AT32F423和NCN5120自制KNX-USB调试模块(附完整PCB与源码)

手把手教你用AT32F423和NCN5120自制KNX-USB调试模块(附完整PCB与源码) KNX作为智能家居和楼宇自动化领域的国际标准协议,其调试工具往往价格昂贵且功能封闭。本文将带你从零开始,用国产MCU雅特力AT32F423和NCN5120 KNX接口芯片&am…...

大模型工具调用对话的工程范式对比——以 DeepSeek-V4 为切入点

引言 在大模型的能力版图里,"推理"和"知识"长期是主角,而"工具调用"则被视为一个工程细节——似乎把 JSON Schema 喂给模型、让它吐回一段结构化 JSON 就够了。但随着 Agent 范式的崛起,这个看似平淡的接口层正在变成整个系统架构的应力集中…...

3分钟掌握Windows Defender永久禁用技巧:开源管理工具完全指南

3分钟掌握Windows Defender永久禁用技巧:开源管理工具完全指南 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://gitcode.com/gh_mirrors/de/defender-contro…...

Java任务编排框架的终极解决方案:如何用DAG引擎提升微服务架构效率?

Java任务编排框架的终极解决方案:如何用DAG引擎提升微服务架构效率? 【免费下载链接】taskflow taskflow是一款轻量、简单易用、可灵活扩展的通用任务编排框架,基于有向无环图(DAG)的方式实现,框架提供了组件复用、同步/异步编排、…...

为什么BetterGI的自动战斗系统如此智能?深度解析原神自动化辅助工具的技术奥秘

为什么BetterGI的自动战斗系统如此智能?深度解析原神自动化辅助工具的技术奥秘 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 …...

鸿蒙系统开发者如何快速接入大模型服务,使用Taotoken实现多模型调用

鸿蒙系统开发者如何快速接入大模型服务,使用Taotoken实现多模型调用 1. 鸿蒙应用集成AI能力的挑战 在鸿蒙应用开发中引入大模型能力时,开发者常面临几个实际问题。首先是模型供应商的选择与接入复杂度,不同厂商的API协议、认证方式和计费模…...

5个实战技巧:彻底解决Mesa3D Windows驱动部署难题

5个实战技巧:彻底解决Mesa3D Windows驱动部署难题 【免费下载链接】mesa-dist-win Pre-built Mesa3D drivers for Windows 项目地址: https://gitcode.com/gh_mirrors/me/mesa-dist-win 你是否曾经在Windows上尝试使用Mesa3D驱动时,遇到了令人头疼…...

怪物猎人世界终极叠加层指南:HunterPie免费工具5分钟快速上手

怪物猎人世界终极叠加层指南:HunterPie免费工具5分钟快速上手 【免费下载链接】HunterPie-legacy A complete, modern and clean overlay with Discord Rich Presence integration for Monster Hunter: World. 项目地址: https://gitcode.com/gh_mirrors/hu/Hunte…...

D3KeyHelper:5个核心机制解析与实战配置指南——暗黑3技能连点器深度剖析

D3KeyHelper:5个核心机制解析与实战配置指南——暗黑3技能连点器深度剖析 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一…...

专业音频转换工具:3步实现跨平台音乐自由播放

专业音频转换工具:3步实现跨平台音乐自由播放 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://gitco…...

如何高效配置Windows虚拟游戏手柄:vJoy完整实战指南

如何高效配置Windows虚拟游戏手柄:vJoy完整实战指南 【免费下载链接】vJoy Virtual Joystick 项目地址: https://gitcode.com/gh_mirrors/vj/vJoy 想要在Windows系统上体验专业游戏手柄的控制感,却不想购买昂贵的硬件设备?vJoy虚拟摇杆…...

完全掌握华硕笔记本性能优化:G-Helper专业级硬件控制实战指南

完全掌握华硕笔记本性能优化:G-Helper专业级硬件控制实战指南 【免费下载链接】g-helper G-Helper is a fast, native tool for tuning performance, fans, GPU, battery, and RGB on any Asus laptop or handheld - ROG Zephyrus, Flow, Strix, TUF, Vivobook, Zen…...

为内部知识库问答系统集成Taotoken多模型能力的架构思考

为内部知识库问答系统集成Taotoken多模型能力的架构思考 1. 多模型接入的核心价值 在企业知识库问答系统的架构设计中,模型能力的多样性直接影响回答质量与系统可靠性。通过Taotoken平台提供的统一API接入层,架构师可以避免为每个模型供应商单独维护对…...

高效二维码工具:Chrome-QRCode完整指南,5分钟掌握跨设备内容传输

高效二维码工具:Chrome-QRCode完整指南,5分钟掌握跨设备内容传输 【免费下载链接】chrome-qrcode :zap: A Chrome plugin to Genrate QRCode of URL / Text, or Decode the QRcode in website. 一个Chrome浏览器插件,用于生成当前URL或者选中…...

Python医疗影像预处理崩溃全记录(CT/MRI/DR三模态调试避坑手册)

更多请点击: https://intelliparadigm.com 第一章:Python医疗影像预处理崩溃全记录(CT/MRI/DR三模态调试避坑手册) 医疗影像预处理是AI辅助诊断 pipeline 中最易“静默失败”的环节——看似加载成功,实则像素值溢出、…...

初创团队如何通过 Taotoken 统一管理多个 AI 模型的开发与成本

初创团队如何通过 Taotoken 统一管理多个 AI 模型的开发与成本 1. 多模型接入的挑战与解决方案 初创技术团队在开发 AI 产品原型时,往往需要同时调用多个大模型进行功能验证和效果对比。传统模式下,开发者需要为每个模型单独注册账号、申请 API Key、对…...

前端新手福音:用快马平台和ccswitch轻松理解状态管理

作为一个刚接触前端状态管理的新手,我最近发现了一个特别适合入门的学习组合:ccswitch状态管理库InsCode(快马)平台。通过这个组合,我快速理解了状态管理的核心概念,而且整个过程完全不需要配置环境,特别适合像我这样刚…...

Agent 一接下拉选择器就开始选错项:从 Option Grounding 到 Commit Fence 的工程实战

很多团队把浏览器 Agent 接进运营后台后,最容易低估的不是按钮,而是下拉选择器。⚠️ 页面上明明看到了“华东一区”或“标准版”,提交后落库的却是另一个同名选项,最后一路传导到权限和审批流配置。 人类在选下拉项时&#xff0c…...

长期使用Taotoken服务对其API稳定性和客服响应速度的感受

长期使用Taotoken服务对其API稳定性和客服响应速度的感受 1. 平台API稳定性体验 在过去六个月的日常开发工作中,我们团队持续使用Taotoken作为大模型API的统一接入层。从技术指标来看,API端点响应成功率保持在较高水平,未出现长时间服务不可…...