Kotlin高仿微信-第4篇-主页-消息

news2024/10/7 6:45:40

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">


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/wechat_recyclerview"
        android:layout_marginVertical="10dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="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 WeChatFragment : BaseDataBindingFragment<WcFragmentWechatBinding>(){

    override fun getLayoutRes()  = R.layout.wc_fragment_wechat

    val chatViewModel : ChatViewModel by viewModels()

    private var adapter = WeChatAdapter()
    private var account = ""

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        var layoutManager = LinearLayoutManager(requireContext())
        layoutManager.orientation = LinearLayoutManager.VERTICAL
        wechat_recyclerview.layoutManager =  layoutManager
        wechat_recyclerview.adapter = adapter

        account = DataStoreUtils.getAccount()
        chatViewModel.getLastChatByName(account)
        chatViewModel.chatTempListLiveData.observe(viewLifecycleOwner){
            adapter.refresh(it)
        }

        //点击
        adapter.setOnItemClickInterface(object : WcOnItemClickInterface{
            override fun onItemClick(obj: Any) {

                var chatBean : ChatTempBean?
                if(obj is ChatTempBean){
                    chatBean = obj
                } else {
                    return
                }

                var bundle = bundleOf(ChatFragment.USER_ID to chatBean.account)
                Navigation.findNavController(wechat_recyclerview).navigate(R.id.nav_chat, bundle)
            }
        })

        //长按
        adapter.setOnItemLongClickInterface(object : WcOnItemLongClickInterface{
            override fun onItemLongClick(position: Int) {
                showDeleteDialog(position)
            }
        })

    }


    private var baseDialogUtils : BaseDialogUtils? = null

    //显示删除对话框
    fun showDeleteDialog(position : Int){
        var view = LayoutInflater.from(this.requireActivity()).inflate(R.layout.wc_chat_delete_tip, null)
        baseDialogUtils = BaseDialogUtils(this.requireActivity())
        baseDialogUtils!!.builder()
            .showView(view)
            .setCancelable(false)
            .setOnLoadingClick(object : BaseDialogUtils.OnLoadingClick{
                override fun onClickCancel() {

                }

                override fun onClickConfirm() {
                    var chatTempBean = adapter.getItemObject(position)
                    if(chatTempBean!=null){
                        chatViewModel.deleteChatByFromAndToAccount(account, chatTempBean.account)
                    }
                    adapter.remove(position)
                }
            })
        baseDialogUtils?.show()
    }

    //刷新
    fun refresh(){
        var account = DataStoreUtils.getAccount()
        chatViewModel.getLastChatByName(account)
    }

}
/**
 * Author : wangning
 * Email : maoning20080809@163.com
 * Date : 2022/4/28 12:06
 * Description :
 */
class WeChatAdapter : RecyclerView.Adapter<WeChatAdapter.WeChatViewHolder>() {

    private var chatList = ArrayList<ChatTempBean>()

    private var wcOnItemClickInterface : WcOnItemClickInterface? = null
    private var wcOnItemLongClickInterface : WcOnItemLongClickInterface? = null

    fun setOnItemClickInterface(onItemClickInterface: WcOnItemClickInterface){
        this.wcOnItemClickInterface = onItemClickInterface
    }

    fun setOnItemLongClickInterface(onItemLongClickInterface: WcOnItemLongClickInterface){
        this.wcOnItemLongClickInterface = onItemLongClickInterface
    }

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

    override fun onBindViewHolder(holder: WeChatViewHolder, position: Int) {
        var chatBean = chatList.get(position)
        //holder.nameTextView.text = chatBean.name
        holder.contentTextView.text = chatBean.content

        //GlideUtils.load(holder.avatarImageView, chatBean.avatar, R.drawable.wc_avatar_default)

        BaseUtils.showAvatarRounded(chatBean.account, holder.avatarImageView, holder.nameTextView, BaseUtils.getDimension(R.dimen.distance_4), R.drawable.wc_avatar_default)


        holder.rootLayout.setOnClickListener {
            wcOnItemClickInterface?.onItemClick(chatBean)
        }

        holder.rootLayout.setOnLongClickListener {
            wcOnItemLongClickInterface?.onItemLongClick(position)
            true
        }
    }

    fun getItemObject(position : Int) : ChatTempBean? = chatList?.get(position)

    //删除某个
    fun remove(position: Int){
        this.chatList?.removeAt(position)
        notifyDataSetChanged()
    }


    //刷新页面
    fun refresh(chatList : ArrayList<ChatTempBean>){
        this.chatList = chatList
        notifyDataSetChanged()
    }

    override fun getItemCount() = chatList.size

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

        var avatarImageView = itemView.findViewById<ImageView>(R.id.wechat_item_avatar)
        var nameTextView = itemView.findViewById<TextView>(R.id.wechat_item_name)
        var contentTextView = itemView.findViewById<TextView>(R.id.wechat_item_content)
        var rootLayout = itemView.findViewById<ConstraintLayout>(R.id.wechat_item_layout)
    }
}

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

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

相关文章

Android Studio / IDEA 调试金手指:live template自动打印方法名以及所有变量

ctrl alt s 搜设置&#xff0c;template&#xff0c;结果是在 live template 区域设置代码模板的&#xff0c;不知这功能和直播有何关系&#xff0c;live stream&#xff1f; live template 就是自动完成一段代码。比如输入 fori&#xff0c;然后ctrl空格补全循环体&#xf…

Apache-DButils以及Druid(德鲁伊) 多表连接查询的解决方案:两种

Apache-DButils以及Druid(德鲁伊) 多表连接查询的问题 每博一文案 张爱玲说&#xff0c;于千万人之中&#xff0c;遇到你所要遇到的人&#xff0c;于千万年之中&#xff0c;时间的无涯的荒野里&#xff0c;没有 早一步&#xff0c;也没有晚一步&#xff0c;刚巧赶上了。 人生海…

iPhone开机密码什么时候会用到?忘记了怎么办?

iPhone的开机密码也是屏幕解锁密码&#xff0c;它的作用还是很重要的。一般用在&#xff1a; 解锁手机手机重启后解锁手机系统更新后第一次解锁手机手机连接电脑需要信任设备Face ID或指纹解锁失败三次后连接Apple Watch后第一次解锁手机 虽然我们现在经常使用其他的解锁方式&…

马斯克特斯拉内部邮件火了:痛恨开会,少说黑话

金磊 羿阁 发自 凹非寺量子位 | 公众号 QbitAI马斯克给员工的一封内部邮件火了。鼓励员工拒绝开会、公司规定不合理可以不遵守……俨然一个为员工着想的好老板。一开始人们还奇怪马斯克的画风怎么变这么快&#xff0c;后来才发现原来这是他6年前写的。对象也不是推特员工&#…

BCN点击试剂:1516551-46-4,BCN-succinimidylester,BCN NHS

●中文名&#xff1a;丙烷环辛炔-活性酯&#xff0c;BCN-琥珀酰亚胺酯 ●英文名&#xff1a;BCN-NHS&#xff0c; BCN-NHS 酯&#xff0c;BCN-活性酯&#xff0c;BCN-succinimidylester 【产品理化指标】&#xff1a; CAS号&#xff1a; 1516551-46-4 分子式&#xff1a;C15H17…

58 - 类模板的概念和意义

---- 整理自狄泰软件唐佐林老师课程 1. 思考 在C中是否能够将泛型的思想应用于类&#xff1f; 1.1 类模板 一些类主要用于存储和组织数据元素类中数据组织的方式和数据元素的具体类型无关 如&#xff1a;数组类、链表类、Stack类、Queue类&#xff0c;等 C中模板的思想应用于…

【LeetCode】No.103. Binary Tree Zigzag Level Order Traversal -- Java Version

题目链接&#xff1a;https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/ 1. 题目介绍&#xff08;Binary Tree Zigzag Level Order Traversal&#xff09; Given the root of a binary tree, return the zigzag level order traversal of its nodes’…

【网络编程】第二章 网络套接字(socket+UDP协议程序)

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

html实训大作业《基于HTML+CSS+JavaScript红色文化传媒网站(20页)》

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

群晖修改默认端口为80、443

写之前哔哔两句 我这个人是个有强迫症的人&#xff0c;本来群晖用的好好的&#xff0c;然后觉得为什么还要输入5000、5001端口呢&#xff1f; 然后我就尝试着去修改端口&#xff0c;想修改为40、443的时候&#xff0c;结果提示端口被保留&#xff0c;这我哪能忍&#xff0c;ss…

springboot整合canal

该篇博客是基于前两篇的基础上来实现的&#xff0c;如果没有看过可以看一下前面的步骤 使用docker搭建 MYSQL主从_极速小乌龟的博客-CSDN博客docker 上面搭建mysql主从服务器https://blog.csdn.net/qq_35771266/article/details/128101019?spm1001.2014.3001.5501 ShardingS…

Matlab optimtool优化阵列天线的幅相激励

摘要&#xff1a; 阵列天线的激励幅度和相位控制着其方向图形状。例如锥削分布的幅度可实现低副瓣、递变相位激励可改变波束指向&#xff0c;采用幅相综合控制则可实现平顶波束、余割平方等波束赋形。下面介绍利用Matlab optimtool优化阵列天线的幅相激励实现上述需求。 推文…

超市结算系统|Springboot+Vue通用超市结算收银系统

作者主页&#xff1a;编程千纸鹤 作者简介&#xff1a;Java、前端、Pythone开发多年&#xff0c;做过高程&#xff0c;项目经理&#xff0c;架构师 主要内容&#xff1a;Java项目开发、毕业设计开发、面试技术整理、最新技术分享 收藏点赞不迷路 关注作者有好处 项目编号&…

JavaScript基础语法(变量)

JavaScript基础语法&#xff08;变量&#xff09; 学习路线&#xff1a;JavaScript基础语法&#xff08;输出语句&#xff09;->JavaScript基础语法&#xff08;变量&#xff09;->JavaScript基础语法&#xff08;数据类型&#xff09;->JavaScript基础语法&#xff…

(一)DepthAI-python相关接口:OAK Device

消息快播&#xff1a;OpenCV众筹了一款ROS2机器人rae&#xff0c;开源、功能强、上手简单。来瞅瞅~ 编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查…

SuperMap iPortal 与独立代理服务的 session 共享通过redis配置实现

作者&#xff1a;yx 文章目录前言一、支持的Tomcat系列二、使用步骤1.将 /lib 中所有的 jar 拷贝到 tomcat/lib 目录2.给 tomcat 添加一个系统环境变量 "catalina.base"&#xff0c;变量取值为 tomcat 的根目录3、修改 redis 的相关配置4、在 【SuperMap iPortal / i…

Dreamweaver简单网页——HTML+CSS小米官网首页的设计与实现

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

数字化时代,中小企业如何落地数字化转型

大数据时代&#xff0c;各行各业的行业龙头和大型集团都已经开始了数据管理&#xff0c;让数据成为数据资产。但是在我国&#xff0c;中小企业的数量巨大&#xff0c;很多管理者忽视了这一点&#xff0c;今天我们就来聊一聊中小企业的数字化转型。 中小企业需要数字化转型 首…

博客系统【前后端分离版本】

笔记【博客系统】 测试网站&#xff1a;小孙的博客系统 测试&#xff1a;admin 测试&#xff1a;123456 实现一个网站&#xff0c;有两种典型的风格&#xff1a; 服务器渲染客户端渲染&#xff08;前后端分离&#xff09; 所谓渲染&#xff0c;就是把一个动态页面给构造出来 页…

性能测试fangan

XX 5.0系统 性能测试方案 修订历史记录 1 项目概述 1.1 背景说明 1.2 测试目的 为保证在日常运行及大型活动期间&#xff0c;稳定运行、应用快速&#xff0c;对进行性能测试&#xff0c;验证系统是否能够达到业务所需的性能指标&#xff0c;同时发现系统中存在的性能瓶颈&a…