鸿蒙版微信聊天UI效果实现!

最近开发中要做一个类似微信聊天的工单系统客服中心界面(安卓版)所以想着也模仿一个鸿蒙版(基于 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发布会要来了