Kotlin高仿微信-第5篇-主页-通讯录

news2025/1/18 4:34:33

 Kotlin高仿微信-项目实践58篇详细讲解了各个功能点,包括:注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。

Kotlin高仿微信-项目实践58篇,点击查看详情

效果图:

实现代码:

<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.wn.wechatclientdemo.view.LineBaseView
        android:id="@+id/contacts_new_friends"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginTop="12dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/contacts_recyclerview"
        app:layout_constraintTop_toBottomOf="@+id/contacts_new_friends"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_width="match_parent"
        android:layout_height="0dp"/>


</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

/**
 * author : wangning
 * email : maoning20080809@163.com
 * Date : 2022/4/7 13:13
 * description : 通讯录页面
 */
class ContactsFragment : BaseDataBindingFragment<WcFragmentContactsBinding>() {

    override fun getLayoutRes() = R.layout.wc_fragment_contacts

    private val contactsViewModel : ContactsViewModel by viewModels()

    private var adapter : ContactsAdapter = ContactsAdapter()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        //TagUtils.d("新联系人 onViewCreated ")

        contacts_new_friends.builder()
            .hideRightImage()
            .hideContent()
            .setTitle("新的朋友")
            .setRootClick(View.OnClickListener {
                //Navigation.findNavController(it).navigate(R.id.action_contacts_friends)
                ToastUtils.showBaseTip()
            })
            .setLeftImage(R.drawable.wc_friends_contacts)

        if(!EventBus.getDefault().isRegistered(this)){
            EventBus.getDefault().register(this)
        }

        var linearLayoutManager = LinearLayoutManager(requireContext())
        linearLayoutManager.orientation = LinearLayoutManager.VERTICAL
        contacts_recyclerview.layoutManager = linearLayoutManager
        contacts_recyclerview.adapter = adapter

        var account = DataStoreUtils.getAccount()
        contactsViewModel.getContactsList(account)
        contactsViewModel.contactsListLiveData.observe(viewLifecycleOwner) {
            adapter.refresh(it)
        }

        adapter.setOnItemClickInterface(object : ContactsAdapter.OnItemClickInterface{
            override fun onItemClick(contactsBean: ContactsBean) {

                var account = DataStoreUtils.getAccount()
                var chatccount = ""
                if(account.equals(contactsBean.fromAccount)){
                    chatccount = contactsBean.toAccount
                } else {
                    chatccount = contactsBean.fromAccount
                }

                var bundle = bundleOf(ChatFragment.USER_ID to chatccount)
                Navigation.findNavController(contacts_recyclerview).navigate(R.id.action_chat, bundle)
            }
        })

    }

    /*override fun onResume() {
        super.onResume()
        TagUtils.d("通讯录 onHiddenChanged = onResume")
    }

    override fun onStop() {
        super.onStop()
        TagUtils.d("通讯录 onHiddenChanged = onStop ")
    }

    override fun onHiddenChanged(hidden: Boolean) {
        super.onHiddenChanged(hidden)
        TagUtils.d("通讯录 onHiddenChanged = ${hidden}")
        if(!hidden){
            TagUtils.d("通讯录 onHiddenChanged = ")
        }
    }*/

    @Subscribe(threadMode = ThreadMode.MAIN)
    fun onMessageCallback(eventMsgBean: EventMsgBean) {
        //TagUtils.d("刷新联系人列表 type = ${eventMsgBean.type}")
        if(eventMsgBean.type == EventMsgBean.TYPE_REFRESH_CONTACTS){
            refresh()
        }
    }

    fun refresh(){
        var account = DataStoreUtils.getAccount()
        contactsViewModel.getContactsList(account)
    }

    override fun onDestroy() {
        super.onDestroy()
        EventBus.getDefault().unregister(this)
    }


}

/**
 * Author : wangning
 * Email : maoning20080809@163.com
 * Date : 2022/4/24 12:09
 * Description : 通讯录
 */
class ContactsAdapter : RecyclerView.Adapter<ContactsAdapter.ContactsViewHolder>() {

    private var contactList : MutableList<ContactsBean> = ArrayList()
    private var onItemClickInterface : OnItemClickInterface? = null
    fun setOnItemClickInterface(onItemClickInterface: OnItemClickInterface){
        this.onItemClickInterface = onItemClickInterface
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ContactsViewHolder {
        var view = LayoutInflater.from(parent.context).inflate(R.layout.wc_contacts_item, parent, false)
        return ContactsViewHolder(view)
    }

    override fun onBindViewHolder(holder: ContactsViewHolder, position: Int) {
        var contactsBean = contactList.get(position)
        contactsBean?.let {

            var account = DataStoreUtils.getAccount()
            var avatarAccount = ""
            if(account.equals(contactsBean.fromAccount)){
                avatarAccount = contactsBean.toAccount
            } else {
                avatarAccount = contactsBean.fromAccount
            }
            BaseUtils.showAvatarRounded(avatarAccount, holder.avatar, holder.name, BaseUtils.getDimension(R.dimen.distance_4), R.drawable.wc_avatar_default)

            holder.rootLayout.setOnClickListener {
                onItemClickInterface?.onItemClick(contactsBean)
            }
        }
    }

    fun refresh(contactList : MutableList<ContactsBean>) {
        this.contactList = contactList
        notifyDataSetChanged()
    }

    override fun getItemCount() = contactList?.size

    class ContactsViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView) {

        var avatar = itemView.findViewById<ImageView>(R.id.contacts_item_avatar)
        var name = itemView.findViewById<TextView>(R.id.contacts_item_name)
        var rootLayout = itemView.findViewById<ConstraintLayout>(R.id.contacts_item_layout)
    }

    interface OnItemClickInterface{
        fun onItemClick(contactsBean: ContactsBean)
    }
}

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

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

相关文章

【博客547】keepalived实现vip的原理剖析

keepalived实现vip的原理剖析 keepalived实现vip的原理&#xff1a;vrrp gratuitous arp 1、vrrp vrrp更多细节参考&#xff1a;vrrp技术白皮书 相关术语&#xff1a; VRRP工作过程 VRRP的工作过程为&#xff1a; 1、虚拟路由器中的路由器根据优先级选举出Master。Master…

【Python】五、程序循环结构

文章目录实验目的一、掌握while语句二、掌握for循环和range()内建函数三、掌握循环语句嵌套四、掌握break语句和continue语句五、编写程序实现猜数字的游戏1.设计思路2.设计算法3.参考代码4.实验截图实验目的 掌握循环结构&#xff1b;培养学生动手查阅资料能力和解决实际问题的…

matlab实现线性参数的最小二乘法处理

一、实验目的 最小二乘法原理是一种在多学科领域中获得广泛应用的数据处理方法。通过实验要求掌握最小二乘法基本原理、正规方程以及组合测量的最小二乘法处理办法。 二、实验原理 &#xff08;1&#xff09;测量结果的最可信赖值应在残余误差平方和为最小的条件下求出&#…

破局模块总结 -- 宁向东的清华管理学课总结

1. 管理学就是要破局而出 为什么需要管理学&#xff1f;德鲁克说&#xff0c;我们需要选择正确的事情去做&#xff0c;并且把事情作对。 管理学是一个分析、权衡和决策的学问&#xff0c;分析、权衡和选择的目的是什么&#xff1f;就是要破局而出。 管理學是研究人類管理活動…

《Linux运维总结:基于快照模式迁移单节点elasticsearch数据(方案二)》

一、背景信息 说明&#xff1a;由于整个系统需要从互联网迁移到政务外网&#xff0c;elasticsearch作为其中一个组件&#xff0c;也需要将 所有索引数据 迁移到政务外网。 由于数据量比较大&#xff0c;所以使用快照的模式对elasticsearch数据进行备份及恢复操作&#xff0c;提…

[附源码]计算机毕业设计springboot病人跟踪治疗信息管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

接口测试当中的权限限制测试和状态机测试【杭州多测师_王sir】【杭州多测师】...

一、权限限制 权限限制我需要单独拎出来讲&#xff0c;它很重要&#xff01;很多系统中都存在系统管理员、普通用户等不同角色的用户&#xff0c;系统管理员拥有一些普通用户没有的权限&#xff0c;比如系统管理员可以发布公告&#xff0c;而普通用户则只能查看&#xff0c;系统…

【MATLAB教程案例48】初识点云——pcshow,pointCloud,pcwrite,pcread,pcdenoise等点云基本操作函数学习

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 本课程效果预览 目录 1.软件版本 2.什么是点云?

〖全域运营实战白宝书 - 高转化文案速成篇①〗- 文案速成导学与常见文案类型

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

CAD特殊符号,你不一定会

在CAD软件中&#xff0c;有时候会输入一些特殊的符号。比如在标明高低差的时候会输入“”号&#xff0c;在标明管子或者钢筋的直径为输入直径符号“”&#xff0c;为了标明角度值需要输入符号“”&#xff0c;那么这些符号怎么快速的绘制出来呢&#xff1f;我们一起用CAD梦想画…

[附源码]Python计算机毕业设计SSM基于java的图书管理系统(程序+LW)

环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 Maven管理等…

手把手安装Origin软件

Origin是由OriginLab公司开发的一个科学绘图、数据分析软件&#xff0c;支持在Microsoft Windows下运行。Origin支持各种各样的2D/3D图形。Origin中的数据分析功能包括统计&#xff0c;信号处理&#xff0c;曲线拟合以及峰值分析。Origin中的曲线拟合是采用基于Levernberg-Marq…

缩短汽车服务企业供销链,数商云经销商平台渠道订货模块打造企业销售新模式

随着新能源汽车的快速发展&#xff0c;越来越多的颠覆型玩家进入市场&#xff0c;汽车产品和技术在变&#xff0c;市场环境与结构在变&#xff0c;消费者需求在变&#xff0c;渠道也必然随之改变&#xff0c;全新销售模式横空出世&#xff0c;为传统汽车销售带来前所未有的挑战…

import机制浅析

文章目录import机制入口文件绝对导入和相对导入绝对导入相对导入解决import报错问题小结import机制 ​ 在我们执行python文件时&#xff0c;python通过sys.path进行路径搜索的&#xff0c;整体来说&#xff0c;分为三种搜索模式 1.#系统的内置模块进行搜索&#xff1b; exp&a…

基于PHP+MySQL大学教学工作网络平台的设计与实现

随着在校学生人数的不断增加,学生的数量也在不断的增加,同时面临的就是如何更加方便快捷和高效的管理学生的大学教学工作信息,传统模式的大学教学工作管理明显已经不能够满足当下的需求,于是我们提出了大学教学工作系统的设计与开发。 本课题基于PHP,在Windows7系统的环境下,利…

基于模态凝聚算法的特征系统实现算法的自然激励技术(Matlab代码实现)

&#x1f389;&#x1f389;&#x1f389;&#x1f389;欢迎您的到来&#x1f60a;&#x1f60a;&#x1f60a; &#x1f96c;博客主页&#xff1a;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 &#x1f4dd;床头铭&#xff1a;将来的我一定会感谢…

(万字详解)MySQL增删改查(基础+进阶)

目录 &#x1f433;今日良言:眼里有不朽的光芒 心里有永恒的希望 &#x1f415;一、MySQL增删改查(基础) &#x1f402;1.初识CURD &#x1f40d;2.使用CURD &#x1f407;二、MySQL增删改查(进阶) &#x1f41d;1.数据库约束 &#x1f411;2.表的设计 &#x1f42d;3.…

面向切面编程的一些概念

横切关注点 散播应用中多处的功能被称为横切关注点 安全就是一个关注点&#xff0c;每个方法或者类都需要注重安全方法参数日志记录也是一个关注点以及事务管理 横切关注点从概念上讲是与业务分离的&#xff0c;但往往会直接嵌入到业务中 多个类使用到相同的功能。最常见到的就…

【C++面向对象程序设计】CH5 继承与派生

目录 前言 一、继承与派生的概念 二、派生类的声明方式 1.格式 2.【例】假定已经声明一个基类student&#xff0c;在它基础上通过单继承建立一个派生类student1。 三、派生类的构成 四、派生类成员的访问属性 前言 1.公有继承 &#xff08;1&#xff09;公有基类在派…

r、 weka从决策树模型看员工为什么离职?

马云说&#xff1a;“员工离职的原因总是只有两个&#xff1a;钱&#xff0c;没有到位;心委屈了。” 现在很多老板都抱怨说&#xff0c;年轻人的流动率太高了&#xff0c;员工觉得老板的钱太少了&#xff0c;最后还是多指责。 最近我们被客户要求撰写关于员工离职的研究报告&…