最近开发中要做一个类似微信聊天的工单系统客服中心界面(安卓版)所以想着也模仿一个鸿蒙版(基于 java ui 的,js ui 版本的后期更新哈) 那么废话不多数说我们正式开始。
具体实现
mainabiilty 布局文件: 观察布局文件,我们可以看到写了一个列表控件 listcontainer 来装载发送出去的消息和接收到的消息。
然后底部写了一个 textfield 控件来处理用户的输入和一个 button 来触发发送的动作。 逻辑代码
我们初始化对应控件并且 listcontainer 和适配器绑定到一起:
private void initview() { listcontainer= (listcontainer) findcomponentbyid(resourcetable.id_main_list); textfield= (textfield) findcomponentbyid(resourcetable.id_main_textfiled); mainbtn= (button) findcomponentbyid(resourcetable.id_main_my_btn); mainbtn.setclickedlistener(this); myprovider=new myprovider(data,getability()); listcontainer.setitemprovider(myprovider); myprovider.notifydatachanged();//有新消息时,刷新listview中的显示 }
①初始默认假数据
我们方便展示就写了 3 条假数据仅供展示:
private void initmsg() { msg msg1 = new msg(你好,msg.received); data.add(msg1); msg msg2 = new msg(你好呀,msg.sent); data.add(msg2); msg msg3 = new msg(很高兴认识你,msg.received); data.add(msg3); }
②用户输入逻辑: @override public void onclick(component component) { content=textfield.gettext().tostring(); switch (component.getid()){ case resourcetable.id_main_my_btn: if(!flag){ msg msg = new msg(content, msg.sent); data.add(msg); flag=true; }else { msg msg = new msg(content, msg.received); data.add(msg); flag=false; } myprovider.notifydatachanged();//有新消息时,刷新listview中的显示 textfield.settext();//清空输入框的内容 break; default: break; } } 我们通过一个布尔值 flag 来做一个开关处理用户输入的,动作轮流来处理是接收到消息还是发送出消息。 发送消息:
msg msg = new msg(content, msg.sent); data.add(msg); 接收消息:
msg msg = new msg(content, msg.received); data.add(msg); bena 类
package com.example.imdemo.bean;public class msg{ public static final int received = 0;//收到一条消息 public static final int sent = 1;//发出一条消息 private string content;//消息的内容 private int type;//消息的类型 public msg(string content,int type){ this.content = content; this.type = type; } public string getcontent(){ return content; } public int gettype(){ return type; }} 我们分别定义了 2 个常量和 2 个变量来处理我们的消息逻辑。
适配器
适配器 item.xml 布局: item 布局预览效果: 适配器逻辑代码:package com.example.imdemo.provider;import com.example.imdemo.resourcetable;import com.example.imdemo.bean.msg;import ohos.aafwk.ability.ability;import ohos.agp.components.*;import java.util.list;public class myprovider extends baseitemprovider { private list list; private ability ability; public myprovider(list list, ability ability) { this.list = list; this.ability = ability; } @override public int getcount() { return list.size(); } @override public object getitem(int i) { return list.get(i); } @override public long getitemid(int i) { return i; } @override public component getcomponent(int i, component component, componentcontainer componentcontainer) { viewhodler hodler=null; msg msg = list.get(i); if (component== null) { component = layoutscatter.getinstance(ability).parse(resourcetable.layout_item,null,false); hodler=new viewhodler(); hodler.leftlayout = (directionallayout) component.findcomponentbyid(resourcetable.id_left_layout); hodler.rightlayout = (directionallayout) component.findcomponentbyid(resourcetable.id_right_layout); hodler.leftmsg = (text) component.findcomponentbyid(resourcetable.id_left_msg); hodler.rightmsg = (text) component.findcomponentbyid(resourcetable.id_right_msg); component.settag(hodler); } else { hodler= (viewhodler) component.gettag(); } system.out.println(type--- > +msg.gettype()); if(msg.gettype()==msg.received){ system.out.println(左边消息); //如果是收到的消息,则显示左边消息布局,将右边消息布局隐藏 hodler.leftlayout.setvisibility(0); hodler.rightlayout.setvisibility(1); hodler.leftmsg.settext(msg.getcontent()); }else if(msg.gettype()==msg.sent){ system.out.println(右边消息); //如果是发出去的消息,显示右边布局的消息布局,将左边的消息布局隐藏 hodler.rightlayout.setvisibility(0); hodler.leftlayout.setvisibility(1); hodler.rightmsg.settext(msg.getcontent()); } return component; } class viewhodler{ directionallayout leftlayout; directionallayout rightlayout; text leftmsg; text rightmsg; }} 我们通过在 getcomponent 方法中通过小标 i 来遍历集合然后拿到里面每一个对应里面的 type 属性来判断是显示左边布局还是右边布局。 也就是对应的发送消息和接收消息的 ui,我们通过简单布局显示影藏来实现消息的左右两边显示效果,到此整个仿微信聊天的布局 ui 效果就讲完了 。 总结
鸿蒙的仿微信聊天 ui 效果实现起来相对比较简单,其实还有一种办法那就是 listcontainer 的多布局也是通过 bean 里面的标识来显示左右不同的布局实现聊天界面的效果。
工业级无人机会出现垄断者吗?
卫安采用海能达一键通对讲机技术提高运营效率
自动驾驶精选新闻:深圳发布首批19个智能驾驶路测区域
湖南红太阳光电科技有限公司印度200MW太阳能电池产业园项目电气火灾监控系统
MIT开发无限寿命的充电电池
鸿蒙版微信聊天UI效果实现!
线路板上也能打个“补丁”最大程度降低了系统设计难度
基于EDA仿真验证进行IGBT芯片研发的方法使用
电缆接头如何做防水处理,有哪些方法可以做出防水接头
双11手机促销战白热化:新一轮5G换机潮有望来临
iPhone升级至iOS 14系统无法接受短信?
处理器多个核心间通信难题将被破解
NV040D语音芯片在共享按摩椅上的应用
Linux MMC子系统-eMMC常用命令说明(1)
安卓机皇小米6即将发布,颜值与速度兼备,你期待吗?
卡巴斯基引领工控安全升级 开创智能新未来
PCB板的各种互连方式解析
人脸识别门禁技术得到广泛应用
优必选服务机器人NLP技术最新研究进展
华为Mate10什么时候上市?华为Mate10最新消息:华为Mate9价格大跳水让路华为Mate10,华为Mate10发布会要来了