Kotlin高仿微信-第57篇-VIP管理列表

news2024/9/23 17:22:51

  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"
        android:background="@drawable/wc_base_bg">

        <include layout="@layout/wc_base_top_title" />

        <androidx.appcompat.widget.AppCompatEditText
            android:id="@+id/vip_query_name"
            android:layout_marginLeft="12dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/vip_query_btn"
            app:layout_constraintTop_toTopOf="@+id/vip_query_btn"
            app:layout_constraintBottom_toBottomOf="@+id/vip_query_btn"
            android:hint="@string/wc_vip_manager_query_tip"
            android:layout_marginRight="10dp"
            android:layout_width="0dp"
            android:layout_height="wrap_content"/>

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/vip_query_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:layout_marginRight="12dp"
            android:text="查询"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/base_top_root_layout" />

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

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

/**
 * Author : wangning
 * Email : maoning20080809@163.com
 * Date : 2022/6/19 22:58
 * Description : Vip管理页面
 */
class VipManagerFragment : BaseDataBindingFragment<WcVipManagerItemBinding>(){

    override fun getLayoutRes() = R.layout.wc_vip_manager_main
    private var adapter: VipManagerAdapter = VipManagerAdapter(mutableListOf())
    private val vipManagerViewModel : VipManagerViewModel by viewModels()
    private val userViewModel: UserViewModel by viewModels()

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

        super.builder().setTitleContent(R.string.wc_base_top_vip_manager)

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

        var account = DataStoreUtils.getAccount()
        var userBean = userViewModel.getUserLocalAsync(account)
        TagUtils.d("获取vip操作员账号:${userBean.account}, ${userBean.nickName}")
        adapter.setOperatorName(userBean.nickName)
        adapter.setOnItemClick(object : OnItemClickVip{
            override fun onItemClick(month: Int, vipBean: VipBean) {
                showVipConfirmDialog(month, vipBean)
            }
        })
        vipManagerViewModel.getVipListServer(0)
        vipManagerViewModel.vipListServer.observe(viewLifecycleOwner){
            if(it == null){
                ToastUtils.makeText(R.string.wc_load_data_error)
            } else {
              adapter.refresh(it)
            }
        }

        vipManagerViewModel.isSuccessLiveData.observe(viewLifecycleOwner){
            if(it){
                ToastUtils.makeText(R.string.wc_vip_renewal_success)
            } else {
                ToastUtils.makeText(R.string.wc_vip_renewal_failure)
            }
        }

        vip_query_btn.setOnClickListener {
            if(TextUtils.isEmpty(vip_query_name.text.toString().trim())){
                ToastUtils.makeText(R.string.wc_query_name_empty)
            } else {
                vipManagerViewModel.getVipListLikeServer(0, vip_query_name.text.toString().trim())
            }
        }

    }

    /**
     * 开通vip确认框
     */
    private fun showVipConfirmDialog(month: Int, vipBean: VipBean){

        if(month < 1 || vipBean == null){
            ToastUtils.makeText(R.string.wc_vip_confirm_show_error)
            return
        }
        getFocus(true)
        var view = LayoutInflater.from(requireContext()).inflate(R.layout.wc_vip_confirm_view, null)
        var width = DisplayUtils.getScreenWidth() - BaseUtils.getDimension(R.dimen.distance_40) * 2
        val popupWindow = PopupWindow(view, width, ViewGroup.LayoutParams.WRAP_CONTENT)
        popupWindow.isOutsideTouchable = false //点击弹窗外部是否取消弹窗

        //弹窗出现外部为阴影
        val attributes: WindowManager.LayoutParams = requireActivity().window.getAttributes()
        attributes.alpha = 0.5f
        requireActivity().window.setAttributes(attributes)
        //弹窗取消监听 取消之后恢复阴影
        popupWindow.setOnDismissListener {
            val attributes: WindowManager.LayoutParams = requireActivity().window.getAttributes()
            attributes.alpha = 1f
            requireActivity().window.setAttributes(attributes)
            getFocus(false)
        }
        popupWindow.showAtLocation(vip_recyclerview, Gravity.CENTER, 0, 0)

        var accountTextView = view.findViewById<TextView>(R.id.vip_confirm_account)
        var nameTextView = view.findViewById<TextView>(R.id.vip_confirm_name)
        var monthTextView = view.findViewById<TextView>(R.id.vip_confirm_month)
        accountTextView.text = BaseUtils.getString(R.string.wc_vip_manager_user_account, vipBean.userAccount)
        nameTextView.text = BaseUtils.getString(R.string.wc_vip_manager_user_name, vipBean.userName)
        monthTextView.text = BaseUtils.getString(R.string.wc_vip_confirm_month, "${month}")
        view.findViewById<TextView>(R.id.vip_confirm_cancel).setOnClickListener {
            popupWindow.dismiss()
        }

        view.findViewById<TextView>(R.id.vip_confirm_ok).setOnClickListener {
            popupWindow.dismiss()
            vipManagerViewModel.updateVip(vipBean.userAccount, vipBean.operatorAccount, month)
        }
    }

    private fun getFocus(isForbidBack : Boolean){
        view?.isFocusableInTouchMode = true
        view?.requestFocus()
        view?.setOnKeyListener { view, keyCode, event ->
            if(event.action == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
                if(isForbidBack){
                    ToastUtils.makeText(R.string.wc_vip_confirm_back)
                }
            }
            isForbidBack
        }
    }

}

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

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

相关文章

[附源码]Python计算机毕业设计Django家庭整理服务管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

微服务绕不过的坎-服务雪崩

引言 书接上篇 微服务外交官-Feign &#xff0c;讲完了SpringCloud Alibaba 远程调用组件Feign之后&#xff0c;接下来讲微服务项目绕不开的问题&#xff1a;服务雪崩。 概念 微服务架构应用设计其目的之一是为了应对高并发环境&#xff0c;那问题来&#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…

BBR 数学模型直观展示

看 BBR 的理想图示&#xff1a; 但现实中数据包到达并非绝对均匀&#xff0c;考虑统计突发&#xff0c;实际情况如下&#xff1a; ​后文将 Delivery Rate 设为 B(Bandwidth)&#xff0c;将 RTT 设为 D(Delay)。 B/inflt 曲线一定上凸&#xff0c;可想象 1 个 inflt 只有一种…

HTML+CSS+JS网页设计期末课程大作业 DW个人博客网站制作 web前端开发技术 web课程设计 网页规划与设计

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

并发编程知识总结

并发编程知识总结 最近学习了&#xff1a;冰河《深入理解高并发编程》&#xff1b;《并发编程的艺术》&#xff1b; 特此简要对学习做了部分总结&#xff0c;方便后续对并发编程知识的完善和巩固&#xff1b; 若想深入了解学习&#xff0c;可阅读上述参考原著&#xff1b; 线…

基于蝙蝠优化算法的电力系统经济调度研究(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

刷题5-合并两个有序数组

刷题5-合并两个有序数组 解题思路&#xff1a; 把数组nums2的元素复制到数组nums1中&#xff0c;然后利用Java的Arrays.sort()数组排序&#xff0c;默认从小到大 核心代码&#xff1a; class Solution {public void merge(int[] nums1,int m,int[] nums2,int n){for(int i0…

Learning From Documents in the Wild to Improve Document Unwarping论文学习笔记

1 广告 论文2022年发表在SIGGRAPH顶会上。 预训练出来的模型有139M。 对文档的去扭曲变形效果在我们调研的深度学习模型里面算是最好的。 2 摘要 文档图像去扭曲是文档数字化和分析的重要内容。最先进的方法依靠纯合成数据来训练深度网络进行去扭曲。因此&#xff0c;经过训…

为 Go 开发配置Visual Studio Code

在本快速入门中&#xff0c;你将安装和配置 Go for Visual Studio Code 扩展。 在 2020 年 Go 开发人员调查结果中&#xff0c;41% 的受访者选择Visual Studio Code作为他们最喜欢的 Go 编辑器。 这使得Visual Studio Code成为 Go 开发人员最常用的编辑器。 Visual Studio Co…

中间代码生成(Intermediate Code Generation)

中间代码生成&#xff08;Intermediate Code Generation&#xff09;申明语句的翻译类型表达式申明式语句翻译简单赋值语句的翻译数组引用的翻译控制流语句的翻译控制流语句及其SDT布尔表达式及其SDT控制流语句翻译的例子布尔表达式和控制流表达式的回填switch语句的翻译过程调…

游戏开发32课 typescript super

super 在类的方法中super就表示当前类的父类。 如果在子类中写了构造函数&#xff0c;在子类构造函数中必须对父类的构造函数进行调用。 例子 (function() { // 父类 class Animal { name: string; constructor(name: string) { this.na…

25. 答疑 - SAP OData 框架处理 Metadata 元数据请求的实现细节,前后端组件部署在同一台物理服务器

我的知识星球 里有一个朋友提出了 SAP OData 服务 metadata 缓存方面的疑问,本文就来详细说一说: jerry,啥时候有时间给介绍一下fiori的Metadata数据系统的处理机制吧。我现在在做的一个项目,用rap开发的。rap开发的service binding,在maintain service注册时,开始注册的…

简单的个人博客网站设计 静态HTML个人博客主页 DW个人网站模板下载 大学生简单个人网页作品代码 个人网页制作 学生个人网页设计作业

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

TEE安全系统SMC深入理解

1、TEE背景在文章开始之前提几个问题&#xff1a;Android手机中至少运行着几个操作系统OS&#xff1f;如何进入安全操作系统&#xff1f;异常等级和安全操作系统之间的关系&#xff1f;SMC调用的实质、约定及流程是什么&#xff1f;随着智能手机的普及&#xff0c;手机上数据的…

R语言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于预测时间序列数据

原文链接:http://tecdat.cn/?p5919在本文中&#xff0c;我将介绍ARMA&#xff0c;ARIMA&#xff08;Box-Jenkins&#xff09;&#xff0c;SARIMA和ARIMAX模型如何用于预测时间序列数据&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。使用滞后算子计算滞后差分…

[附源码]计算机毕业设计JAVA校园网学生成绩查询系统

[附源码]计算机毕业设计JAVA校园网学生成绩查询系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM …

Android面试题——高级开发面试题二

一 面试题概述 回答自己理解的java虚拟机、gc机制Java多线程、线程池集合原理(hashmap,list)java虚引用封装、继承、多态的理解activity生命周期安卓activity和fragment数据传递Handler内存泄漏、内存溢出、内存抖动 原因及解决办法ANR原因以及解决办法性能优化、卡顿优化事件…

xshell与xftp

目录 1.什么是xshell 2.下载xshell与xftp 3.安装与操作xshell 4.什么是xftp 5.安装与操作xftp 6.xshell与xftp互联 1.什么是xshell Xshell是一个强大的安全终端模拟软件&#xff0c;它支持SSH1&#xff0c;SSH2&#xff0c; 以及Microsoft Windows平台的TELNET协议。. …

[Camunda BPMN进阶] 电商订单流程设计与调试

目录 摘要 基于BPMN的软件设计思想 电商订单流程业务场景 基本订单流程BPMN设计 1.最基本流程设计 2. 添加超时未付款自动取消功能 3. 添加15分钟付款提醒 4. 添加用户取消订单事件 进阶订单流程BPMN设计 1. 使用并行网关执行任务 2. 将具有相同事件分支的任务合并…