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


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

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

    效果图:

    实现代码:

    
    
    
    
        
    
        
    
    
    
    

    /**
     * author : wangning
     * email : maoning20080809@163.com
     * Date : 2022/4/7 13:13
     * description : 通讯录页面
     */
    class ContactsFragment : BaseDataBindingFragment() {
    
        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() {
    
        private var contactList : MutableList = 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) {
            this.contactList = contactList
            notifyDataSetChanged()
        }
    
        override fun getItemCount() = contactList?.size
    
        class ContactsViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView) {
    
            var avatar = itemView.findViewById(R.id.contacts_item_avatar)
            var name = itemView.findViewById(R.id.contacts_item_name)
            var rootLayout = itemView.findViewById(R.id.contacts_item_layout)
        }
    
        interface OnItemClickInterface{
            fun onItemClick(contactsBean: ContactsBean)
        }
    }

  • 相关阅读:
    Java架构师必备基本功需求调研和分析
    通信协议(二)——SPI协议
    AWR仿真报错invalid noise data found
    GPT的前世今生:从gpt1到chatgpt的能力提升
    基于LSTM-CNN的人体活动识别
    自学Python第二十五天- Pipenv 虚拟环境和包管理工具
    花青素染料 Cy3NS 酸,Cy3NS acid,CAS:1032678-01-5物化性质解析
    苹果证书分类及作用详解,助力开发者高效管理应用程序
    五、接口测试工具:Postman
    BigDecimal使用
  • 原文地址:https://blog.csdn.net/maoning20080808/article/details/128089885