package com.yidianling.consultant.adapter import android.annotation.SuppressLint import android.content.Context import android.graphics.Typeface import android.text.SpannableStringBuilder import android.text.Spanned import android.text.TextUtils import android.text.style.StyleSpan import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.ydl.webview.H5Params import com.ydl.webview.NewH5Activity import com.ydl.ydl_image.config.SimpleImageOpConfiger import com.ydl.ydl_image.module.GlideApp import com.ydl.ydlcommon.base.config.HttpConfig import com.ydl.ydlcommon.utils.LogUtil import com.ydl.ydlcommon.utils.URLUtils import com.ydl.ydlcommon.utils.actionutil.ActionCountUtils import com.ydl.ydlcommon.utils.remind.ToastHelper import com.yidianling.consultant.IExpertSearchView import com.yidianling.consultant.R import com.yidianling.consultant.constants.ConsultBIConstants import com.yidianling.consultant.listener.OnExpertClickListener import com.yidianling.consultant.model.bean.ExpertServiceItem import com.yidianling.consultant.modular.utils.TempH5RouteUtils import com.yidianling.consultant.router.ConsultantIn import kotlinx.android.synthetic.main.consultant_activity_hot_search.* import kotlinx.android.synthetic.main.consultant_expert_search_feedbackrate.view.* import kotlinx.android.synthetic.main.consultant_expert_search_header_view.view.* import kotlinx.android.synthetic.main.consultant_expert_search_item_view.view.* import kotlinx.android.synthetic.main.consultant_expert_search_products_item.view.* import kotlinx.android.synthetic.main.consultant_item_empty.view.* import kotlinx.android.synthetic.main.consultant_item_footer.view.* import kotlinx.android.synthetic.main.consultant_item_tag.view.* import kotlinx.android.synthetic.main.consultant_layout_search_content.* import java.math.BigDecimal /** * 专家服务列表适配器 */ class ExpertSearchAdapter( private val context: Context, private val expertSearchView: IExpertSearchView, private val listData: ArrayList<ExpertServiceItem>, private val onExpertClick: OnExpertClickListener? = null ) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { companion object { const val HEADER_VIEW = 3 const val NORMAL_VIEW = 0 const val FOOT_VIEW = 1 const val EMPTY_VIEW = 2 } interface OnClickLister { fun onClick(searchWords:String) } private lateinit var mOnClickLister: OnClickLister fun setOnClickLister(lister: OnClickLister) { mOnClickLister = lister } //记录当前选择主题的id var cateId: String? = null var hasMore = true var pageIndex: Int = 0 var clickCount=0 // 搜索结果提示标签点击次数 var mIsRecommendWords = false // 是否是推荐词 fun setEntrance(pageIndex: Int) { this.pageIndex = pageIndex } fun setIsRecommendWords(isRecommend:Boolean){ mIsRecommendWords = isRecommend } @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { if (holder is HeaderViewHolder) { // 搜索结果提示头部 if (listData.size>0){ if (listData[0].is_head_view){ if (clickCount==0){ holder.clSearchWords.visibility = View.VISIBLE var text = "根据匹配,为您推荐“${listData[0].related_word}”的搜索结果" holder.tvSearchRelatedWord.text = setTextBold(text,listData[0].related_word) holder.tvSearchWord.text = listData[0].search_content // 埋点 if (mIsRecommendWords){ ActionCountUtils.baiDuCountSign3(ConsultBIConstants.PART_ID_YDL_USER_MAIN_PAGE,"ydl_user_map_word_visit",listData[0].search_content,listData[0].related_word,"app") }else{ ActionCountUtils.baiDuCountSign3(ConsultBIConstants.PART_ID_YDL_USER_MAIN_PAGE,"ydl_user_correction_word_visit",listData[0].search_content,listData[0].related_word,"app") } holder.tvSearchWord.setOnClickListener { mOnClickLister.onClick(holder.tvSearchWord.text.toString()) ++clickCount if (clickCount==1){ text = "以下是“${listData[0].search_content}”的搜索结果" holder.tvSearchRelatedWord.text = setTextBold(text,listData[0].search_content) holder.tvSearchTips.text = "你要找的是不是" holder.tvSearchWord.text = listData[0].related_word // 埋点 if (mIsRecommendWords){ ActionCountUtils.baiDuCountSign3(ConsultBIConstants.PART_ID_YDL_USER_MAIN_PAGE,"ydl_user_map_inputword_click",listData[0].related_word,listData[0].search_content,"app") }else{ ActionCountUtils.baiDuCountSign3(ConsultBIConstants.PART_ID_YDL_USER_MAIN_PAGE,"ydl_user_correction_inputword_click",listData[0].related_word,listData[0].search_content,"app") } }else if (clickCount==2){ // 第二次点击搜索标签隐藏搜索匹配结果提示 // 埋点 if (mIsRecommendWords){ ActionCountUtils.baiDuCountSign3(ConsultBIConstants.PART_ID_YDL_USER_MAIN_PAGE,"ydl_user_map_recommendword_click",listData[0].search_content,listData[0].related_word,"app") }else{ ActionCountUtils.baiDuCountSign3(ConsultBIConstants.PART_ID_YDL_USER_MAIN_PAGE,"ydl_user_correction_recommendword_click",listData[0].search_content,listData[0].related_word,"app") } listData.removeAt(0) clickCount = 0 // 点击两次后重置为0 } } } } } } else if (holder is NormalViewHolder) { val itemBean = listData[position] //头像 val headConfig = SimpleImageOpConfiger() headConfig.loadingPic = R.drawable.consultant_avatar_def_circle headConfig.errorPic = R.drawable.consultant_avatar_def_circle expertSearchView.showImage( itemBean.head, holder.imgHead, holder.imgHead.width, holder.imgHead.height, headConfig ) //姓名 holder.tvName.text = itemBean.doctor_name //服务中 if (itemBean.open_chat_agency == 2 && itemBean.service_status == 2) { holder.imgHead_online_server.visibility = View.VISIBLE holder.chat_people_in_question.visibility = View.GONE holder.imgHead_online.visibility = View.GONE } else { //不是服务中且问询人数大于0 when { itemBean.chat_num > 5 -> { holder.chat_people_in_question.visibility = View.VISIBLE holder.chat_people_in_question.text = "多人在问询" } itemBean.chat_num > 0 -> { holder.chat_people_in_question.visibility = View.VISIBLE holder.chat_people_in_question.text = "${itemBean.chat_num}人在问询" } else -> { holder.chat_people_in_question.visibility = View.GONE } } //可预约 holder.imgHead_online_server.visibility = View.GONE if (itemBean.is_free_today== 1) { holder.imgHead_online.visibility = View.VISIBLE } else { holder.imgHead_online.visibility = View.GONE } } //省市 if (!TextUtils.isEmpty(itemBean.display_region)) { holder.tvCity.text = itemBean.display_region } else { holder.tvCity.text = "" } //公益图标,不与其他图标冲突 if (1 == itemBean.has_servicefree_experience) { if (null != itemBean.icons && !TextUtils.isEmpty(itemBean.icons.service_free_icon)) { expertSearchView.showImage( itemBean.icons.service_free_icon, holder.imgServiceFree ) } else { val sp = SimpleImageOpConfiger() sp.loadingPic = R.drawable.consultant_service_free sp.errorPic = R.drawable.consultant_service_free expertSearchView.showImage("", holder.imgServiceFree, sp) } holder.imgServiceFree.visibility = View.VISIBLE } else { holder.imgServiceFree.visibility = View.GONE } // 展示了抗疫,就不展示其他标签 if (itemBean.fightEpidemicIconShow) { itemBean.icons?.fight_epidemic_icon?.let { GlideApp.with(context).load(itemBean.icons?.fight_epidemic_icon) .into(holder.imgFightEpidemicIcon) holder.imgFightEpidemicIcon.visibility = View.VISIBLE } if (itemBean.joinActivity == true) { //活动图标 if (!TextUtils.isEmpty(itemBean.activityImg)) { holder.imgActivity.visibility = View.VISIBLE GlideApp.with(context).load(itemBean.activityImg).into(holder.imgActivity) } else { holder.imgActivity.visibility = View.GONE } } else { holder.imgActivity.visibility = View.GONE } //影藏其余所有标签(除公益) holder.imgAbilityLevel.visibility = View.GONE holder.imgNewEnter.visibility = View.GONE } else { holder.imgFightEpidemicIcon.visibility = View.GONE //能力等级标签 when (itemBean.abilityLevel) { 1 -> { //实习 holder.imgAbilityLevel.background = context.resources.getDrawable(R.drawable.consultant_expert_search_shixi) holder.imgAbilityLevel.visibility = View.VISIBLE } 2 -> { //新手 holder.imgAbilityLevel.background = context.resources.getDrawable(R.drawable.consultant_expert_search_xinshou) holder.imgAbilityLevel.visibility = View.VISIBLE } else -> { holder.imgAbilityLevel.visibility = View.GONE } } //活动图标 if (!TextUtils.isEmpty(itemBean.activityImg)) { holder.imgActivity.visibility = View.VISIBLE GlideApp.with(context).load(itemBean.activityImg).into(holder.imgActivity) } else { holder.imgActivity.visibility = View.GONE } //新驻图标 if (itemBean.is_new_enter != null && itemBean.is_new_enter!!) { if (null != itemBean.icons && !TextUtils.isEmpty(itemBean.icons.new_enter_icon)) { expertSearchView.showImage( itemBean.icons.new_enter_icon, holder.imgNewEnter ) } else { val sp = SimpleImageOpConfiger() sp.loadingPic = R.drawable.consultant_new_enter sp.errorPic = R.drawable.consultant_new_enter expertSearchView.showImage("", holder.imgNewEnter, sp) } holder.imgNewEnter.visibility = View.VISIBLE } else { holder.imgNewEnter.visibility = View.GONE } } holder.ll_feedbackRate.removeAllViews() for (num in 1..5) { val view = LayoutInflater.from(context).inflate( R.layout.consultant_expert_search_feedbackrate, holder.ll_feedbackRate, false ) if (itemBean.evaluation_average_score >= num) { (view.imgRate as ImageView).background = context.resources.getDrawable(R.drawable.consultant_expert_search_full_star) } else if (itemBean.evaluation_average_score < num && itemBean.evaluation_average_score > num - 1) { (view.imgRate as ImageView).background = context.resources.getDrawable(R.drawable.consultant_expert_search_half_star) } else { (view.imgRate as ImageView).background = context.resources.getDrawable(R.drawable.consultant_expert_search_nothing_star) } holder.ll_feedbackRate.addView(view) } //XXX人点评 val numSb = StringBuffer() holder.tv_zixunOrderNum.text = numSb.append(itemBean.evaluate_num).append("").toString() //咨询师简介 holder.tvTeamCertifications.text = itemBean.title //咨询师标签 holder.ll_tags.removeAllViews() itemBean.feature_tags?.let { if (it.isNotEmpty()) { for (tag in itemBean.feature_tags) { val view = LayoutInflater.from(context) .inflate(R.layout.consultant_item_tag, holder.ll_tags, false) tag.tag_name.let { name -> if (name.length > 4) { view.tvTag.text = "${name.substring(0, 4)}…" } else { view.tvTag.text = name } } if (tag.is_highlight) { view.tvTag.setBackgroundResource(R.drawable.consultant_bg_radius_line_eb892c) view.tvTag.setTextColor( ContextCompat.getColor( context, R.color.color_EB892C ) ) } else { view.tvTag.setBackgroundResource(R.drawable.consultant_bg_radius_line_gray_1) view.tvTag.setTextColor( ContextCompat.getColor( context, R.color.platform_color_666666 ) ) } holder.ll_tags.addView(view) } } } //帮助人数 val orderUser = StringBuffer() holder.tvOrderNum.text = orderUser.append(itemBean.help_num).append("").toString() //私聊文案 if (TextUtils.isEmpty(itemBean.chat_btn_text)) { holder.tvChat.text = "私聊" holder.tvChat.setTextColor( ContextCompat.getColor( context, R.color.platform_but_text_color ) ) holder.tvChat.setTextColor( ContextCompat.getColor( context, R.color.platform_but_text_color ) ) holder.tvChat.background = ContextCompat.getDrawable(context, R.drawable.consultant_expert_search_chat) } else { holder.tvChat.text = itemBean.chat_btn_text holder.tvChat.setTextColor( ContextCompat.getColor( context, R.color.platform_color_999999 ) ) holder.tvChat.background = ContextCompat.getDrawable( context, R.drawable.consultant_expert_search_chat_rest ) } //服务时长 val durationStringBuffer = StringBuffer() holder.tvSaleDurationForMonth.text = durationStringBuffer.append(itemBean.sum_service_time.toInt()).append("").toString() //价格 val price = BigDecimal(itemBean.min_price) // 去掉末尾无用的.00 holder.tvPrice.text = price.stripTrailingZeros().toPlainString() //套餐 holder.ll_products.removeAllViews() if (null != itemBean.doctor_products && itemBean.doctor_products.isNotEmpty()) { for (item in itemBean.doctor_products) { val view = LayoutInflater.from(context).inflate( R.layout.consultant_expert_search_products_item, holder.ll_tags, false ) when (item.product_type) { "1" -> { view.tvTitle.text = "单次" view.tvTitle.setTextColor(context.resources.getColor(R.color.platform_color_1DA1F2)) view.tvTitle.background = context.resources.getDrawable(R.drawable.consultant_expert_search_single) view.tvContent.text = item.product_name holder.ll_products.addView(view) } "2" -> { view.tvTitle.text = "套餐" view.tvTitle.setTextColor(context.resources.getColor(R.color.consultant_color_FF9500)) view.tvTitle.background = context.resources.getDrawable(R.drawable.consultant_expert_search_menu) view.tvContent.text = item.product_name holder.ll_products.addView(view) } else -> { } } } } } else if (holder is FooterViewHolder) { if (hasMore) { holder.itemView.visibility = View.VISIBLE holder.pbLoading.visibility = View.VISIBLE holder.tvHint.text = context.getString(R.string.consultant_loading) } else { holder.pbLoading.visibility = View.GONE holder.tvHint.text = context.getString(R.string.platform_no_more) } } } override fun getItemCount(): Int = // if (listData.size < ExpertSearchActivity.PAGE_SIZE && hasMore) { if (listData.size==1) { listData.size } else { listData.size + 1 } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder = when (viewType) { HEADER_VIEW -> { val view = LayoutInflater.from(context).inflate(R.layout.consultant_expert_search_header_view, parent, false) HeaderViewHolder(view) } NORMAL_VIEW -> { val view = LayoutInflater.from(context) .inflate(R.layout.consultant_expert_search_item_view, parent, false) NormalViewHolder(view) } FOOT_VIEW -> { val view = LayoutInflater.from(context) .inflate(R.layout.consultant_item_footer, parent, false) FooterViewHolder(view) } else -> { val view = LayoutInflater.from(context) .inflate(R.layout.consultant_item_empty, parent, false) EmptyViewHolder(view) } } override fun getItemViewType(position: Int): Int = when { position==0&&listData.size>0&&listData[0].is_head_view ->{ HEADER_VIEW } position < listData.size -> { NORMAL_VIEW } !hasMore && listData.size == 0 -> { EMPTY_VIEW } else -> FOOT_VIEW } inner class NormalViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { //头像 val imgHead = itemView.imgHead!! val cv_head_view = itemView.cv_head_view!! //专家姓名 val tvName = itemView.tvName!! //活动图标 val imgActivity = itemView.img_activity!! //优质图标 val imgAbilityLevel = itemView.imgAbilityLevel!! //公益图标 val imgServiceFree = itemView.imgServiceFree!! //新驻图标 val imgNewEnter = itemView.imgNewEnter!! //荣誉标签 val ll_honor_layout = itemView.ll_honor_layout!! //好评率 val ll_feedbackRate = itemView.ll_feedbackRate!! //xxx人点评 val tv_zixunOrderNum = itemView.tv_zixunOrderNum!! //咨询师简介 val tvTeamCertifications = itemView.tvTeamCertifications!! //咨询师标签 val ll_tags = itemView.ll_tags!! //帮助人数 val tvOrderNum = itemView.tvOrderNum!! //帮助人数文案 val tvOrderNumContent = itemView.tvOrderNumContent //服务时长 val tvSaleDurationForMonth = itemView.tvSaleDurationForMonth!! //月售时长文案 val tvSaleDurationForMonthContent = itemView.tvSaleDurationForMonthContent //价格 val tvPrice = itemView.tvPrice!! val tvPriceContent = itemView.tvPriceContent!! val tv_money_symbol = itemView.tv_money_symbol!! //服务套餐 val ll_products = itemView.ll_products!! //私聊按钮 val tvChat = itemView.tvChat!! //个人铭言整个布局 val group_desc = itemView.group_desc!! //个人铭言 val tvDesc = itemView.tvDesc!! //省市 val tvCity = itemView.tvCity!! //今日是否可约 val imgHead_online = itemView.imgHead_online!! //服务中(咨询中或者聆听中) val imgHead_online_server = itemView.imgHead_online_server!! //多少人在问询 val chat_people_in_question = itemView.people_in_question!! // 抗疫先锋图标 val imgFightEpidemicIcon = itemView.img_fightEpidemicIcon init { itemView.setOnClickListener { //跳转专家主页 if (adapterPosition != RecyclerView.NO_POSITION) { val itemBean = listData[adapterPosition] var linkUrl = itemBean.link_url if (!TextUtils.isEmpty(cateId)) { linkUrl = URLUtils.appendParmas(linkUrl, "cateId", cateId) } onExpertClick?.onExpertClick() TempH5RouteUtils.tempH5Route(linkUrl) // 埋点 ActionCountUtils.baiDuCountSign3( ConsultBIConstants.PART_ID_CONSULT_COUNSELOR_LIST_PAGE, ConsultBIConstants.ConsultEvent.POSITION_CONSULT_COUNSELOR_CARD_CLICK, itemBean.id ?: "", "app", "" ) } } itemView.tvChat.setOnClickListener { if (adapterPosition != RecyclerView.NO_POSITION) { val doctor = listData[adapterPosition] if (pageIndex == 0) { ActionCountUtils.count( ConsultBIConstants.ConsultEvent.APP_CONSULT_LIST_CHAT_CLICK, doctor.id ?: "" ) } else { ActionCountUtils.count( ConsultBIConstants.ConsultSearchListEvent.APP_CONSULT_SEARCH_LIST_CHAT_CLICK, doctor.id ?: "" ) } onExpertClick?.onExpertClick() //判断是否已登录 if (!ConsultantIn.getUserImpl().loginByOneKeyLogin(context, true)) { return@setOnClickListener } if (!TextUtils.isEmpty(doctor.uid)) { //跳转私聊 ConsultantIn.startP2PSession(context as AppCompatActivity, doctor.uid!!) ActionCountUtils.count(ConsultBIConstants.UserMainEvent.YDL_PRIVATE_CHAT_CLICK) } else { ToastHelper.show("请联系客服,专家参数错误!") } } } } } inner class HeaderViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val clSearchWords = itemView.cl_search_words val tvSearchRelatedWord = itemView.tv_search_related_word val tvSearchTips = itemView.tv_search_tips val tvSearchWord = itemView.tv_search_word } inner class FooterViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val pbLoading = itemView.pbLoading!! val tvHint = itemView.tvHint!! } inner class EmptyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private val btnSearchByCat = itemView.btnSearchByCat!! init { btnSearchByCat.setOnClickListener { val h5Params = H5Params(HttpConfig.H5_URL + "experts/cates", null) NewH5Activity.start(context, h5Params) } } } private fun setTextBold(text: String, content: String): SpannableStringBuilder { return if (text.contains(content)) { val s1 = text.split(content)[0] val s2 = text.split(content)[1] val spannableBuilder1 = SpannableStringBuilder(s1) val spannableBuilder2 = SpannableStringBuilder(content) spannableBuilder2.setSpan( StyleSpan(Typeface.BOLD), 0, content.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ) spannableBuilder1.append(spannableBuilder2).append(SpannableStringBuilder(s2)) } else { SpannableStringBuilder(text) } } }