Commit 86f23be6 by konghaorui

Merge branch 'feature/v3' of…

Merge branch 'feature/v3' of ssh://gitlab.yidianling.com:2224/app_android_lib/YDL-Component into feature/v3
parents 600d1acd 5ea2e0ca
......@@ -11,7 +11,4 @@
android:name="com.yidianling.home.ui.fragment.YdlHomeFragment"
/>
</LinearLayout>
\ No newline at end of file
......@@ -48,6 +48,17 @@ android {
targetCompatibility 1.8
}
sourceSets {
main {
res.srcDirs = [
'src/main/res',
'src/main/res/layouts',
'src/main/res/layouts/ydlhome', //壹点零用户版首页fragment所在xml
'src/main/res/layouts/ydlhome/holder', //壹点零用户版首页fragment中列表ViewHolder所在xml
]
}
}
}
dependencies {
......
This source diff could not be displayed because it is too large. You can view the blob instead.
package com.yidianling.home.constants
import android.content.Context
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.mvp.base.IModel
import com.ydl.ydlcommon.mvp.base.IPresenter
import com.ydl.ydlcommon.mvp.base.IView
import com.yidianling.home.model.bean.*
import io.reactivex.Observable
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 壹点灵首页约束类
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class IHomeBaseContract {
interface View : IView {
/**
* 首页数据回调接口
*/
fun homeDataResponse(list: MutableList<HomePagerDataBean>)
/**
* 头部数据回调
*/
fun homeHeadResponse(homeHeaderBean: HomeHeaderBean)
/**
* 首页数据请求失败接口
*/
fun homeDataFail(msg: String)
/**
* 获取倾述数据回调
*/
fun confideDataResponse(data: HomeConfideBean, selectPosition: Int)
/**
* 获取咨询数据回调
*/
fun consultDataResponse(data: HomeConsultBean, selectPosition: Int)
/**
* 问答模块数据回调
*/
fun askDataResponse(data: HomeAskBean, position: Int)
/**
* 首页问答 - 点赞
*/
fun askZan(position: Int, index: Int, id: String)
/**
* 首页问答 - 关注
*/
fun askFocus(position: Int, id: String)
/**
* 获取倾述列表数据
* @param type 倾述类型
* @param selectPosition 选中的position
*/
fun getConfideData(type: String, selectPosition: Int)
/**
* 获取咨询列表数据
*/
fun getConsultData(type: String, selectPosition: Int)
fun showHomeProgress()
fun showRefreshLayout()
fun dismissHomeProgress()
fun resetModuleTabPosition()
}
interface Presenter<V : IView> : IPresenter<V> {
/**
* 获取首页本地缓存
*/
fun localHomeData(context: Context, fileName: String)
/**
* 刷新首页数据请求
*/
fun refreshHomeData()
/**
* 获取首页数据请求
*/
fun loadHomeData()
/**
*获取倾述列表
*/
fun getConfideData(type: String, selectPosition: Int)
/**
*获取咨询列表
*/
fun getConsultData(type: String, selectPosition: Int)
/**
* 首页问答 - 点赞
*/
fun askZan(position: Int, index: Int, id: String)
/**
* 首页问答 - 关注
*/
fun askFocus(position: Int, id: String)
/**
* 保存临时数据
*/
fun saveTempData(list: MutableList<HomePagerDataBean>)
/**
* 获取临时数据
*/
fun getHomeItemFromTempData(dataBean: HomeItemBaseBean, type: Int): Any
}
interface Model : IModel {
/**
* 首页头部 分类&Banner请求
*/
fun headerRequest(): Observable<HomeHeaderBean>
/**
* 首页电台请求
*/
fun fmRequest(): Observable<HomeFMBean>
/**
* 首页课程请求
*/
fun courseRequest(): Observable<HomeCourseBean>
/**
* 首页测试题请求
*/
fun testRequest(): Observable<BaseAPIResponse<MutableList<HomeTestItemBean>>>
/**
* 首页咨询请求
*/
fun consultRequest(category: String): Observable<HomeConsultBean>
/**
* 首页倾听请求
*/
fun confideRequest(goodType: String): Observable<HomeConfideBean>
/**
* 首页问答请求
*/
fun askRequest(): Observable<HomeAskBean>
/**
* 首页文章请求
*/
fun articleRequest(): Observable<HomeArticleBean>
/**
* 首页问答 - 点赞
*/
fun askZan(id: String): Observable<AskResultBean>
/**
* 首页问答 - 关注
*/
fun askFocus(id: String): Observable<AskResultBean>
}
}
\ No newline at end of file
package com.yidianling.home.event
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.RecyclerView
import android.text.TextUtils
import android.view.View
import com.alibaba.android.arouter.launcher.ARouter
import com.ydl.media.audio.AudioPlayer
import com.ydl.media.audio.model.Music
import com.ydl.media.view.PlayTypeEnum
import com.ydl.media.view.PlayerFloatHelper
import com.ydl.webview.H5Params
import com.ydl.webview.NewH5Activity
import com.ydl.ydl_router.manager.YDLRouterManager
import com.ydl.ydl_router.manager.YDLRouterParams
import com.ydl.ydl_router.util.YDLRouterParamsUrls
import com.ydl.ydlcommon.base.BaseActivity
import com.ydl.ydlcommon.base.config.HttpConfig
import com.ydl.ydlcommon.bean.ShareData
import com.ydl.ydlcommon.data.PlatformRamImpl
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlcommon.router.IYDLRouterConstant
import com.ydl.ydlcommon.utils.Utils
import com.ydl.ydlcommon.utils.actionutil.ActionCountUtils
import com.ydl.ydlcommon.utils.remind.ToastHelper
import com.ydl.ydlcommon.view.dialog.CommonDialog
import com.yidianling.consultant.constants.HomeBIConstants
import com.yidianling.home.R
import com.yidianling.home.constract.IHomeContract
import com.yidianling.home.model.bean.*
import com.yidianling.router.RouterManager
import com.yidianling.router.im.IMRequestCallback
import com.yidianling.tests.api.service.ITestsApiService
import com.yidianling.user.api.service.IUserService
import de.greenrobot.event.EventBus
import org.json.JSONObject
open class HomeBaseImpl: IHomeBaseEvent {
val HOT_SEARCH_DOCTOR_NAME = "hot_search_doctor_name"
override fun consultItemClick(linkUrl: String?, doctorId: String) {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_EXPERT_INTRODUCTION_CLICK, doctorId)
if (null == linkUrl || linkUrl.isEmpty()) {
return
}
if (linkUrl.startsWith("http")) {
YDLRouterManager.router(
IYDLRouterConstant.ROUTER_H5_H5,
YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_URL, linkUrl), "")
} else {
YDLRouterManager.router(linkUrl)
}
}
override fun consultChatClick(doctorId: String?) {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(
HomeBIConstants.YDL_USER_PRIVATE_CHAT_CLICK, doctorId
?: "")
if (!ModularServiceManager.provide(IUserService::class.java).isLogin()) {
//跳转登录
jumpToLogin()
return
}
if (mContext is AppCompatActivity && !TextUtils.isEmpty(doctorId)) {
//私聊
YDLRouterManager.router(
IYDLRouterConstant.ROUTER_CHAT_PRIVATE,
YDLRouterParams()
.putExtra(IYDLRouterConstant.EXTRA_TOUID, doctorId!!)
.putExtra(IYDLRouterConstant.EXTRA_USERTYPE, "1"))
}
}
fun jumpToLogin() {
ARouter.getInstance().build("/user/login")
.navigation()
}
/**
* 获取咨询列表数据
* 最终调用
* @see com.yidianling.home.ui.fragment.YdlHomeFragment.getConsultData
*
* @param type 倾述类型
* @param selectPosition 选中的position
*/
override fun getConsultData(type: HomeHeaderBean.ConsultCategoryDateBean, selectPosition: Int) {
ActionCountUtils.count(
HomeBIConstants.YDL_USER_CONSULT_TYPE_CLICK, type.name
?: "")
mHomeView!!.getConsultData(type.id.toString(), selectPosition)
}
private var headerView: View? = null
var mContext: Context? = null
var mHomeView: IHomeContract.View? = null
var COURSE_DETAIL_H5 = HttpConfig.WEB_URL + "fe-app-yidianling/course/Detail/"
constructor(context: Context, homeView: IHomeContract.View) {
mContext = context
this.mHomeView = homeView
}
override fun onPageScroll(view_rl_top_bg: View): RecyclerView.OnScrollListener? {
return object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if (headerView == null) headerView = recyclerView?.getChildAt(0)
val top = headerView?.top
val height = Math.abs(top!!)
var per = height.toFloat() / 500
//最大比例为1
if (per > 1f) {
per = 1f
}
val alpha = (per * 255).toInt()
// Log.e("Tag", "alpha=$alpha--per=$per")
view_rl_top_bg.background.mutate().alpha = alpha
}
}
}
override fun serviceCallClick() {
try {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_TELEPHONE_CUSTOMER_SERVICE_CLICK)
val tel = if (PlatformRamImpl.getInstance().getGlobalInfo() == null) "400-114-1010'" else PlatformRamImpl.getInstance().getGlobalInfo()!!.info.tel
var con = "\n400-114-1010\n早8:30-凌晨2:00"
if (PlatformRamImpl.getInstance().getGlobalInfo() != null && PlatformRamImpl.getInstance().getGlobalInfo()!!.info != null) {
con = PlatformRamImpl.getInstance().getGlobalInfo()?.info?.tel + "\n" + PlatformRamImpl.getInstance().getGlobalInfo()?.info?.work_time
}
val dialog = CommonDialog(mContext)
.setTitle("欢迎致电壹点灵客服热线")
.setMessage(con)
.setLeftOnclick("取消") { v1 ->
}.setRightClick("拨打") { v12 ->
val phoneIntent = Intent(
Intent.ACTION_DIAL,
Uri.parse("tel:$tel"))
mContext?.startActivity(phoneIntent)
}
dialog.setMessageOnclick {
}
dialog.show()
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun searchTvClick(text: String) {
if (Utils.isFastClick()) {
//防止连击
return
}
var doctorName = if (text != mContext?.resources?.getString(R.string.search_hint) && text != mContext?.resources?.getString(
R.string.platform_search)) text else ""
ARouter.getInstance()
.build("/consult/hot_search")
.withString(HOT_SEARCH_DOCTOR_NAME, doctorName)
.navigation()
}
override fun consultMoreClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
EventBus.getDefault().post(HomeModuleTabEvent(2))
// YDLRouterManager.router(IYDLRouterConstant.ROUTER_MAIN_TAB, YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_TAB, "2"))
ActionCountUtils.count(HomeBIConstants.YDL_USER_CONSULT_MORE_CLICK)
}
override fun bannerClick(banner: HomeHeaderBean.FocusListBean) {
ActionCountUtils.count(HomeBIConstants.YDL_USER_BANNER_CLICK, banner.focId.toString())
linkTo(banner.linkUrl.toString())
}
override fun categoryClick(data: HomeHeaderBean.AskCategoryDataBean) {
// linkTo(data.url.toString())
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(
HomeBIConstants.YDL_USER_CONSULT_CLASSIFICATION_CLICK, data.cateId.toString(), data.cateTitle
?: "")
goExpertSearch(data)
}
private fun goExpertSearch(data: HomeHeaderBean.AskCategoryDataBean) {
if (!TextUtils.isEmpty(data.url) && data.url!!.endsWith("?")) {
data.url = data.url!!.substring(0, data.url!!.length - 1)
}
if ("全部类别" == data.cateTitle || "全部分类" == data.cateTitle) {
YDLRouterManager.router(
IYDLRouterConstant.ROUTER_H5_H5,
YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_URL, HttpConfig.H5_URL + "experts/cates"))
} else {
//跳转咨询频道页 服务入口
YDLRouterManager.router(
IYDLRouterConstant.ROUTER_CONSULT_LIST,
YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_CATEID, data.cateId.toString()).putExtra(
IYDLRouterConstant.EXTRA_CATETITLE, data.cateTitle!!).putExtra(
IYDLRouterConstant.EXTRA_SHOWTYPE, "0"))
}
}
override fun linkTo(linkUrl: String) {
if (Utils.isFastClick()) {
//防止连击
return
}
YDLRouterManager.router(linkUrl)
}
override fun reservationExpertsClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
EventBus.getDefault().post(HomeModuleTabEvent(2))
// YDLRouterManager.router(IYDLRouterConstant.ROUTER_MAIN_TAB,YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_TAB, "2"))
ActionCountUtils.count(HomeBIConstants.YDL_USER_CONSULT_CLICK)
// 咨询列表页(专家服务搜索页面) ydl-user://consult/list
// YDLRouterManager.router(IYDLRouterConstant.ROUTER_CONSULT_LIST)
}
override fun nowConfideClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
// ARouter.getInstance().build("/confide/home")
// .withFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
// .navigation()
ActionCountUtils.count(HomeBIConstants.YDL_USER_TALK_IN_TIME_CLICK)
//倾诉首页 ydl-user://confide/home
YDLRouterManager.router(IYDLRouterConstant.ROUTER_CONFIDE_HOME)
}
override fun psychologyClassClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
//课程频道页 ydl-user://course/home
// YDLRouterManager.router(IYDLRouterConstant.ROUTER_COURSE_HOME)
//埋点
ActionCountUtils.count(HomeBIConstants.YDL_USER_PSYCHOLOGICAL_CLASSROOM_CLICK)
ARouter.getInstance().build("/course/home").navigation()
}
override fun psychologyTestClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_PSYCHOLOGICAL_TEST_CLICK)
//测评频道首页 ydl-user://ceshi/home
YDLRouterManager.router(IYDLRouterConstant.ROUTER_TEST_HOME)
}
override fun confideMoreClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_LISTEN_MORE_CLICK)
//倾诉首页 ydl-user://qingshu/home
YDLRouterManager.router(IYDLRouterConstant.ROUTER_CONFIDE_HOME)
}
/**
* 倾述咨询师点击
* @param linkUrl 跳转地址
*/
override fun confideClick(linkUrl: String?, doctorId: Int) {
if (Utils.isFastClick()) {
//防止连击
return
}
if (null == linkUrl || linkUrl.isEmpty()) {
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_LISTENER_INTRODUCTION_CLICK, doctorId.toString())
if (linkUrl.startsWith("http")) {
YDLRouterManager.router(
IYDLRouterConstant.ROUTER_H5_H5,
YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_URL, linkUrl), "")
} else {
YDLRouterManager.router(linkUrl)
}
}
/**
* 私聊
*/
override fun toChatForMsg(doctorId: String?) {
if (Utils.isFastClick()) {
//防止连击
return
}
if (!ModularServiceManager.provide(IUserService::class.java).isLogin()) {
//跳转登录
YDLRouterManager.router(IYDLRouterConstant.ROUTER_MINE_LOGIN)
return
}
if (mContext is AppCompatActivity && !TextUtils.isEmpty(doctorId)) {
//私聊
YDLRouterManager.router(
IYDLRouterConstant.ROUTER_CHAT_PRIVATE,
YDLRouterParams()
.putExtra(IYDLRouterConstant.EXTRA_TOUID, doctorId!!)
.putExtra(IYDLRouterConstant.EXTRA_USERTYPE, "1"))
}
//todo xj
RouterManager.getImRouter().createTextMessage(doctorId, "你好,我想找你倾诉,请尽快上线私聊我,我在等你。", object :
IMRequestCallback<Void> {
override fun onSuccess(aVoid: Void?) {
(mContext as BaseActivity).dismissProgressDialog()
ToastHelper.show("发送成功")
}
override fun onFailed(i: Int) {
(mContext as BaseActivity).dismissProgressDialog()
var message = "发送失败"
if (i == 7101) {
message = "您已被对方拉黑!"
}
ToastHelper.show(message)
}
override fun onException(throwable: Throwable?) {
(mContext as BaseActivity).dismissProgressDialog()
ToastHelper.show("发送异常")
}
})
}
override fun courseMreClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
//课程频道页 ydl-user://course/home
// YDLRouterManager.router(IYDLRouterConstant.ROUTER_COURSE_HOME)
ActionCountUtils.count(HomeBIConstants.YDL_USER_COURSE_MORE_CLICK)
ARouter.getInstance().build("/course/home").navigation()
}
override fun courseItemClick(bean: HomeCourseBean.ListBean) {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_COURSE_CLICK, bean.id.toString())
val h5Params = H5Params(COURSE_DETAIL_H5 + bean.id, mContext?.getString(R.string.platform_course_detail))
if (!TextUtils.isEmpty(bean.shareData?.shareUrl)) {
val shareData = ShareData(bean.shareData?.shareUrl, bean.shareData?.title, bean.shareData?.cover, bean.shareData?.desc)
h5Params.shareData = shareData
}
NewH5Activity.start(mContext, h5Params)
}
override fun askItemFocusClick(position: Int, id: String) {
if (!ModularServiceManager.provide(IUserService::class.java).isLogin()) {
//跳转登录
YDLRouterManager.router(IYDLRouterConstant.ROUTER_MINE_LOGIN)
return
}
//关注用户
mHomeView?.askFocus(position, id)
}
override fun askItemZanClick(position: Int, index: Int, id: String) {
if (!ModularServiceManager.provide(IUserService::class.java).isLogin()) {
//跳转登录
YDLRouterManager.router(IYDLRouterConstant.ROUTER_MINE_LOGIN)
return
}
//问答动态点赞
mHomeView?.askZan(position, index, id)
}
override fun askMoreClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_ASK_MORE_CLICK)
//心事动态频道页(首页--问答) ydl-user://answers/home
YDLRouterManager.router(IYDLRouterConstant.ROUTER_ANSWERS_HOME)
}
override fun fmItemClick(bean: HomeFMBean.ListBean) {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_RADIO_CLICK, bean.id.toString())
//电台详情页面
YDLRouterManager.router(
IYDLRouterConstant.ROUTER_FM_DETAIL,
YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_ID, bean.id.toString()))
}
override fun fmPlayClick(fmDetail: HomeFMBean.ListBean) {
ActionCountUtils.count(HomeBIConstants.YDL_USER_RADIO_PLAY_CLICK, fmDetail.id.toString())
if (!TextUtils.isEmpty(fmDetail.fmUrl)) {
val music = Music()
music.path = fmDetail.fmUrl
music.album = fmDetail.imageUrl
music.artist = fmDetail.author
music.coverPath = fmDetail.imageUrl
music.title = fmDetail.name
AudioPlayer.get().singlePlay(music, false)
PlayerFloatHelper.playingType = PlayTypeEnum.PLAY_TYPE_FM
}
PlayerFloatHelper.isCanClick = true
if (PlayerFloatHelper.isShow(mContext!!)) {
if (PlayerFloatHelper.playingType != PlayTypeEnum.PLAY_TYPE_FM) {
PlayerFloatHelper.removeView(mContext!!)
PlayerFloatHelper.show(mContext!!)
} else {
PlayerFloatHelper.setPlayingState(mContext!!)
}
} else {
mContext?.let { PlayerFloatHelper.show(it) }
}
}
override fun fmMoreClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_HEART_RADIO_MORE_CLICK)
//fm列表页 ydl-user://fm/list
YDLRouterManager.router(IYDLRouterConstant.ROUTER_FM_LIST)
}
override fun articleItemClick(bean: HomeArticleBean.Bean?) {
if (Utils.isFastClick()) {
//防止连击
return
}
if (bean == null) {
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_ARTICLE_CLICK, bean.id.toString())
YDLRouterManager.router(
IYDLRouterConstant.ROUTER_H5_H5,
YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_URL, bean.gethUrl()!!), "")
}
override fun articleMoreClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_ARTICLE_MORE_CLICK)
//文章列表页 ydl-user://article/list
ARouter.getInstance().build("/article/list").navigation()
// YDLRouterManager.router(IYDLRouterConstant.ROUTER_ARTICLE_LIST)
}
override fun askItemClick(bean: HomeAskBean.DataBean) {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_ASK_COMMENT_CLICK, bean.id.toString())
val bundle = Bundle()
bundle.putInt("trend_id", bean.id)
bundle.putInt("comment_count", bean.commentsCount)
bundle.putBoolean("is_comment", false)
//动态详情
ARouter.getInstance().build("/trends/detail")
.withBundle("bundle", bundle)
.navigation()
}
override fun publishTrendClick() {
val bundle = Bundle()
bundle.putString("publish_type", "topic_publish")
bundle.putString("topic_id", "44")
bundle.putString("topic_title", "今日打卡")
//发布动态
ARouter.getInstance().build("/trend/publish")
.withBundle("bundle", bundle)
.navigation()
}
/**
* 获取倾述列表数据
* 最终调用
* @see com.yidianling.home.ui.fragment.YdlHomeFragment.getConfideData
*
* @param type 倾述类型
* @param selectPosition 选中的position
*/
override fun getConfideData(type: HomeHeaderBean.ListenCategoryDateBean, selectPosition: Int) {
ActionCountUtils.count(
HomeBIConstants.YDL_USER_LISTEN_TYPE_CLICK, type.name
?: "")
mHomeView!!.getConfideData(type.id.toString(), selectPosition)
}
override fun testItemClick(linkUrl: String?) {
if (Utils.isFastClick()) {
//防止连击
return
}
if (null == linkUrl || linkUrl.isEmpty()) {
return
}
if (linkUrl.startsWith("app")) {
val uri = Uri.parse(linkUrl)
if ("ceshi" == uri.host) {
val id = uri.getQueryParameter("id")
ModularServiceManager.provide(ITestsApiService::class.java).testDetailH5(id)
}
} else if (linkUrl.startsWith("http")) {
YDLRouterManager.router(
IYDLRouterConstant.ROUTER_H5_H5,
YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_URL, linkUrl), "")
} else if (linkUrl.contains("ceshi/detail?")) {
val routerParamsUrls = YDLRouterParamsUrls(linkUrl)
val jsonObject = JSONObject(routerParamsUrls.getParams())
ModularServiceManager.provide(ITestsApiService::class.java).testDetailH5(jsonObject.getString("id").toString())
} else {
YDLRouterManager.router(linkUrl)
}
}
override fun testMoreClick() {
psychologyTestClick()
}
}
\ No newline at end of file
package com.yidianling.home.event
import android.support.v7.widget.RecyclerView
import android.view.View
import android.widget.ImageView
import com.yidianling.home.model.bean.*
import com.yidianling.home.ui.view.CouponDialog
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 首页点击事件接口类
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
interface IHomeBaseEvent {
/**
* 服务电话点击事件
*/
fun serviceCallClick()
/**
* 动态编辑按钮点击
*/
fun publishTrendClick()
/**
* 咨询条目点击事件
*/
fun consultItemClick(linkUrl: String?, doctorId: String)
/**
* 咨询私聊点击事件
*/
fun consultChatClick(doctorId: String?)
/**
* 测试条目点击事件
*/
fun testItemClick(linkUrl: String?)
/**
* 测试更多点击事件
*/
fun testMoreClick()
/**
* 咨询更多点击事件
*/
fun consultMoreClick()
/**
* 搜索框点击事件
*/
fun searchTvClick(text:String)
/**
* 列表滚动事件
*/
fun onPageScroll(view_rl_top_bg: View): RecyclerView.OnScrollListener?
/**
* 跳转链接点击
* Banner & 首页分类 & 首页条目 使用
*/
fun linkTo(linkUrl: String)
/**
* banner点击跳转
*/
fun bannerClick(banner:HomeHeaderBean.FocusListBean)
/**
* 首页分类跳转
*/
fun categoryClick(category: HomeHeaderBean.AskCategoryDataBean)
/**
* 预约专家点击事件
*/
fun reservationExpertsClick()
/**
* 即可倾诉点击事件
*/
fun nowConfideClick()
/**
* 心理课堂点击事件
*/
fun psychologyClassClick()
/**
* 心理测试点击事件
*/
fun psychologyTestClick()
/**
* 倾诉更多点击事件
*/
fun confideMoreClick()
/**
* 倾述咨询师点击
* @param linkUrl 跳转地址
*/
fun confideClick(linkUrl: String?, doctorId: Int)
/**
* 私聊
*/
fun toChatForMsg(doctorId: String?)
/**
* 课程item点击事件
*/
fun courseItemClick(bean: HomeCourseBean.ListBean)
/**
* 课程更多点击事件
*/
fun courseMreClick()
/**
* 问答条目关注点击事件
* @param id : 用户uid
*/
fun askItemFocusClick(position:Int,id: String)
/**
* 问答条目点赞事件
* @param id : 动态id
*/
fun askItemZanClick(position:Int,index:Int,id: String)
/**
* 问答更多点击事件
*/
fun askMoreClick()
/**
* 问答条目点击事件
*/
fun askItemClick(bean:HomeAskBean.DataBean)
/**
* 电台条目点击播放事件
*/
fun fmPlayClick(bean: HomeFMBean.ListBean)
/**
* 电台条目点击进入详情
*/
fun fmItemClick(bean: HomeFMBean.ListBean)
/**
* 电台更多点击事件
*/
fun fmMoreClick()
/**
* 文章更多点击事件
*/
fun articleMoreClick()
/**
* 文章item点击事件
*/
fun articleItemClick(bean: HomeArticleBean.Bean?)
/**
* 获取倾述列表数据
* 最终调用
* @see com.yidianling.home.ui.fragment.YdlHomeFragment.getConfideData
*
* @param type 倾述类型
* @param selectPosition 选中的position
*/
fun getConfideData(type: HomeHeaderBean.ListenCategoryDateBean, selectPosition: Int)
/**
* 获取咨询列表数据
* 最终调用
* @see com.yidianling.home.ui.fragment.YdlHomeFragment.getConsultData
*
* @param type 类型
* @param selectPosition 选中的position
*/
fun getConsultData(type: HomeHeaderBean.ConsultCategoryDateBean, selectPosition: Int)
}
\ No newline at end of file
package com.yidianling.home.http
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.data.http.BaseResponse
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlnet.YDLHttpUtils
import com.yidianling.home.model.bean.*
import com.yidianling.user.api.service.IUserService
import io.reactivex.Observable
class HomeBaseHttp {
companion object {
fun getInstance(): HomeBaseHttp {
return Holder.INSTANCE
}
}
object Holder {
val INSTANCE = HomeBaseHttp()
}
private var homeApi: HomeBasePagerApi? = null
fun getHomePagerApi(): HomeBasePagerApi {
if (homeApi == null) {
homeApi = YDLHttpUtils.obtainApi(HomeBasePagerApi::class.java)
}
return homeApi!!
}
//首页头部 分类&Banner 请求
fun newHomeHeaderRequest(): Observable<BaseAPIResponse<HomeHeaderBean>> {
return getHomePagerApi().getHomeHeaderData()
}
//首页倾述请求
fun getConfideData(goodType: String): Observable<BaseAPIResponse<HomeConfideBean>> {
val loginBean = ModularServiceManager.provide(IUserService::class.java).getUserInfo()
var userId = loginBean?.uid ?: "";
return getHomePagerApi().getConfideData(goodType, uid = userId);
}
//首页课程请求
fun getCourseData(listType: String = "10"): Observable<BaseAPIResponse<HomeCourseBean>> {
val loginBean = ModularServiceManager.provide(IUserService::class.java).getUserInfo()
var userId = loginBean?.uid ?: "";
return getHomePagerApi().getCourseData(listType, uid = userId);
}
//首页测试请求
fun getTestData(): Observable<BaseAPIResponse<MutableList<HomeTestItemBean>>> {
val loginBean = ModularServiceManager.provide(IUserService::class.java).getUserInfo()
var userId = loginBean?.uid ?: "";
return getHomePagerApi().getTestData(uid = userId)
}
//首页问答请求
fun getAskData(): Observable<BaseAPIResponse<HomeAskBean>> {
val loginBean = ModularServiceManager.provide(IUserService::class.java).getUserInfo()
var userId = loginBean?.uid ?: "";
var token = loginBean?.accessToken ?: "";
return getHomePagerApi().getAskData(accessToken = token, uid = userId);
}
//首页电台请求
fun getFMData(): Observable<BaseAPIResponse<HomeFMBean>> {
return getHomePagerApi().getFMData();
}
//首页文章请求
fun getArticleData(perPageRows: String = "4"): Observable<BaseAPIResponse<HomeArticleBean>> {
return getHomePagerApi().getArticleData()
}
//首页咨询请求
fun getConsultData(goodType: String): Observable<BaseAPIResponse<HomeConsultBean>> {
val loginBean = ModularServiceManager.provide(IUserService::class.java).getUserInfo()
var userId = loginBean?.uid ?: ""
return getHomePagerApi().getConsultData(category = goodType, uid = userId)
}
//首页问答 - 点赞
fun askZan(id: String): Observable<BaseResponse<AskResultBean>> {
val cmd = AskRequestParamBean.ZanAction("2", id)
return RxUtils.mapObservable(cmd).flatMap { getHomePagerApi().askZan(it) }
}
//首页问答 - 关注
fun askFocus(id: String): Observable<BaseResponse<AskResultBean>> {
val cmd = AskRequestParamBean.FocusCmd(id, "1")
return RxUtils.mapObservable(cmd).flatMap { getHomePagerApi().askFocus(it) }
}
}
\ No newline at end of file
package com.yidianling.home.http
import com.ydl.ydlcommon.base.BaseApp
import com.ydl.ydlcommon.base.config.YDL_DOMAIN
import com.ydl.ydlcommon.base.config.YDL_DOMAIN_JAVA
import com.ydl.ydlcommon.data.PlatformDataManager
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.data.http.BaseResponse
import com.yidianling.common.tools.RxDeviceTool
import com.yidianling.home.model.bean.*
import io.reactivex.Observable
import retrofit2.http.*
/**
* @author jiucheng
* @描述:首页接口api
* @Copyright Copyright (c) 2018
* @Company 壹点灵
* @date 2018/8/22
*/
interface HomeBasePagerApi {
/**
* 首页头部数据 Banner&分类
*/
@GET("home/index")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getHomeHeaderData(): Observable<BaseAPIResponse<HomeHeaderBean>>
/**
* 首页咨询请求
* goodType 为空或不传 则获取默认类型数据
*/
@GET("doctor/list")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getConsultData(
@Query("categories") category: String,
@Query("limit") limit: String = "3",
@Query("page") page: String = "1",
@Query("uid") uid: String,
@Query("searchWord") searchWord: String = "",
@Query("showType") showType: String = "0",
@Query("ffrom") ffrom: String = PlatformDataManager.getRam().getChannelName(),
@Query("version") version: String = RxDeviceTool.getAppVersionName(BaseApp.getApp())
): Observable<BaseAPIResponse<HomeConsultBean>>
/**
* 首页倾述请求
* goodType 为空或不传 则获取默认类型数据
*/
@GET("auth/listen/search")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getConfideData(
@Query("goodType") goodType: String,
@Query("limit") limit: String = "3",
@Query("page") page: String = "1",
// 1: 查询第一个类型列表,较goodType比,低优先级
@Query("isDefaultType") isDefaultType: String = "1",
@Query("uid") uid: String,
@Query("ffrom") ffrom: String = PlatformDataManager.getRam().getChannelName(),
@Query("version") version: String = RxDeviceTool.getAppVersionName(BaseApp.getApp())
): Observable<BaseAPIResponse<HomeConfideBean>>
//首页课程请求
@GET("auth/course/getList")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getCourseData(
@Query("listType") listType: String = "10",
@Query("limit") limit: String = "3",
@Query("uid") uid: String,
@Query("ffrom") ffrom: String = PlatformDataManager.getRam().getChannelName(),
@Query("version") version: String = RxDeviceTool.getAppVersionName(BaseApp.getApp())
): Observable<BaseAPIResponse<HomeCourseBean>>
//首页测试请求
@GET("test-item/home-recommend")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getTestData(
@Query("uid") uid: String,
@Query("ffrom") ffrom: String = PlatformDataManager.getRam().getChannelName(),
@Query("version") version: String = RxDeviceTool.getAppVersionName(BaseApp.getApp())
): Observable<BaseAPIResponse<MutableList<HomeTestItemBean>>>
//首页问答请求
@GET("ask/list-old")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getAskData(
@Query("perPageRows") perPageRows: String = "6",
@Query("tab") tab: String = "2",
@Query("accessToken") accessToken: String,
@Query("uid") uid: String
): Observable<BaseAPIResponse<HomeAskBean>>
//首页电台请求
@GET("fm/list/all")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getFMData(@Query("perPageRows") perPageRows: String = "4"): Observable<BaseAPIResponse<HomeFMBean>>
//首页文章请求
@GET("article/list/all")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getArticleData(@Query("perPageRows") perPageRows: String = "4"): Observable<BaseAPIResponse<HomeArticleBean>>
//首页问答 - 点赞
@FormUrlEncoded
@POST("sq-active/zan")
fun askZan(@FieldMap params: Map<String, String>): Observable<BaseResponse<AskResultBean>>
//首页问答 - 关注
@FormUrlEncoded
@POST("sq-active/focus")
fun askFocus(@FieldMap params: Map<String, String>): Observable<BaseResponse<AskResultBean>>
}
\ No newline at end of file
package com.yidianling.home.model
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.data.http.RxUtils
import com.yidianling.home.constants.IHomeBaseContract
import com.yidianling.home.http.HomeBaseHttp
import com.yidianling.home.model.bean.*
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
open class BaseHomeModelImpl : IHomeBaseContract.Model {
/**
* 首页咨询请求
*/
override fun consultRequest(category: String): Observable<HomeConsultBean> {
return HomeBaseHttp.getInstance().getConsultData(category).compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { HomeConsultBean(true) }
}
/**
* 首页问答 - 点赞
*/
override fun askZan(id: String): Observable<AskResultBean> {
return HomeBaseHttp.getInstance().askZan(id).compose(RxUtils.resultData())
}
/**
* 首页问答 - 关注
*/
override fun askFocus(id: String): Observable<AskResultBean> {
return HomeBaseHttp.getInstance().askFocus(id).compose(RxUtils.resultData())
}
/**
* 首页电台请求
*/
override fun fmRequest(): Observable<HomeFMBean> {
return HomeBaseHttp.getInstance().getFMData().compose(RxUtils.resultJavaData())
.onErrorReturn { HomeFMBean(true) }
}
/**
* 首页课程请求
*/
override fun courseRequest(): Observable<HomeCourseBean> {
return HomeBaseHttp.getInstance().getCourseData().compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { HomeCourseBean(true) }
}
/**
* 首页测试题请求
*/
override fun testRequest(): Observable<BaseAPIResponse<MutableList<HomeTestItemBean>>> {
return HomeBaseHttp.getInstance().getTestData()
}
/**
* 首页倾听请求
*/
override fun confideRequest(goodType: String): Observable<HomeConfideBean> {
return HomeBaseHttp.getInstance().getConfideData(goodType).compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { HomeConfideBean(true) }
}
/**
* 首页问答请求
*/
override fun askRequest(): Observable<HomeAskBean> {
return HomeBaseHttp.getInstance().getAskData().compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { HomeAskBean(true) }
}
/**
* 首页文章请求
*/
override fun articleRequest(): Observable<HomeArticleBean> {
return HomeBaseHttp.getInstance().getArticleData().compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { HomeArticleBean(true) }
}
/**
* 首页头部 分类&Banner请求
*/
override fun headerRequest(): Observable<HomeHeaderBean> {
return HomeBaseHttp.getInstance().newHomeHeaderRequest().compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { HomeHeaderBean(true) }
}
}
\ No newline at end of file
package com.yidianling.home.model.bean;
import com.ydl.ydlcommon.data.http.BaseCommand;
/**
......@@ -32,3 +33,4 @@ public class AskRequestParamBean {
}
}
......@@ -41,7 +41,7 @@ class HomeConfideBean : HomeItemBaseBean {
/**
* 实际费用
*/
var confideFee: String? =null
var confideFee: String = "0"
/**
* 接通率
*/
......@@ -57,7 +57,7 @@ class HomeConfideBean : HomeItemBaseBean {
/**
* 红包金额
*/
var couponMoney: String? = null
var couponMoney: String = "0"
var confidedTag: List<String>? = null
/**
* 红包展示文本
......
......@@ -80,6 +80,9 @@ class HomeConsultBean: HomeItemBaseBean {
var isHiddenXcx: String? = null
var tags: String? = null
//私聊文案
var chatBtnText: String? = null
class ShareBean {
/**
* title : 姜建萍咨询工作室
......
package com.yidianling.home.presenter
import android.annotation.SuppressLint
import android.content.Context
import android.text.TextUtils
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.ydl.ydlcommon.base.BaseApp
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlcommon.data.http.ThrowableConsumer
import com.ydl.ydlcommon.mvp.base.BasePresenter
import com.ydl.ydlcommon.mvp.base.IModel
import com.ydl.ydlcommon.mvp.base.IView
import com.ydl.ydlcommon.utils.SharedPreferencesEditor
import com.ydl.ydlcommon.utils.YDLAsyncUtils
import com.yidianling.common.tools.RxAppTool
import com.yidianling.home.constants.IHomeBaseContract
import com.yidianling.home.model.bean.HomeAskBean
import com.yidianling.home.model.bean.HomeItemBaseBean
import com.yidianling.home.model.bean.HomePagerDataBean
import com.yidianling.home.utils.HomeFileUtils
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.functions.Consumer
import io.reactivex.schedulers.Schedulers
abstract class BaseHomePresenterImpl< V : IHomeBaseContract.View,M : IHomeBaseContract.Model>:
BasePresenter< V, M>(), IHomeBaseContract.Presenter<V> {
abstract override fun createModel(): M
/**
* 获取首页数据请求
*/
abstract override fun loadHomeData()
/**
* 保存临时数据
*/
abstract override fun saveTempData(list: MutableList<HomePagerDataBean>)
/**
* 获取临时数据
*/
abstract override fun getHomeItemFromTempData(dataBean: HomeItemBaseBean, type: Int): Any
/**
* 刷新首页数据请求
*/
abstract override fun refreshHomeData()
var CACHE_HOME_PAGER_DATA = "cache_home_pager_data"
//首页json文件和缓存数据结构不一致时临时使用
var IS_NEW_CACHE_HOME_PAGER_DATA = "IS_NEW_CACHE_HOME_PAGER_DATA"
//首页缓存版本号
var HOME_PAGER_DATA_CACHE_VERISON = "HOME_PAGER_DATA_CACHE_VERISON"
private var mConsultDisposable: Disposable? = null
private var mConfideDisposable: Disposable? = null
private var mHomeDisposable: Disposable? = null
var mConfideType: String = ""
var mConsultType: String = ""
@Volatile
var mHomeAskBean: HomeAskBean? = null
//首页数据缓存
var homeTempData: HomePagerDataBean = HomePagerDataBean()
/**
* 加载本地缓存
*/
override fun localHomeData(context: Context, fileName: String) {
YDLAsyncUtils.asyncAsResult(object : YDLAsyncUtils.AsyncObjecyerResult {
override fun doAsyncAction(): Any {
//首页缓存数据
var cacheHomeData: String
//是否为新的数据结构
val isNewPageData = SharedPreferencesEditor.getString(IS_NEW_CACHE_HOME_PAGER_DATA)
val homeCacheVersion =
SharedPreferencesEditor.getString(HOME_PAGER_DATA_CACHE_VERISON)
val appVersionCode = RxAppTool.getAppVersionCode(BaseApp.getApp())
//版本更新后不使用上个版本的首页缓存
cacheHomeData = if (isNewPageData.isEmpty() || (!TextUtils.isEmpty(homeCacheVersion) && appVersionCode > homeCacheVersion.toInt())) {
""
} else {
//上次首页缓存数据
SharedPreferencesEditor.getString(CACHE_HOME_PAGER_DATA)
}
if (cacheHomeData.isEmpty()) {
//第一次安装使用本地临时数据
cacheHomeData =
String(HomeFileUtils.getAssertsFile(context, fileName)!!)
}
return cacheHomeData
}
override fun asyncResult(`object`: Any?) {
//如果没 有缓存数据,显示加载框
if (`object` !is String || TextUtils.isEmpty(`object`)) {
mView.showRefreshLayout()
}
if (`object` is String) {
val list = Gson().fromJson<MutableList<HomePagerDataBean>>(
`object`,
object : TypeToken<MutableList<HomePagerDataBean>>() {
}.type
)
if (null != list && !list.isEmpty()) {
mView.homeDataResponse(list)
saveTempData(list)
}
}
}
})
}
/**
*获取倾述列表
*/
@SuppressLint("CheckResult")
override fun getConfideData(type: String, selectPosition: Int) {
disposeConfide()
disposeHome()
mConfideType = type
mConfideDisposable = mModel.confideRequest(type)
.map { it }
.filter { true }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
mView.confideDataResponse(it, selectPosition)
}, object : ThrowableConsumer() {
override fun accept(msg: String) {
mView.homeDataFail(msg)
}
})
}
/**
*获取咨询列表
*/
override fun getConsultData(type: String, selectPosition: Int) {
disposeConsult()
disposeHome()
mConsultType = type
mConsultDisposable = mModel.consultRequest(type)
.map { it }
.filter { true }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
mView.consultDataResponse(it, selectPosition)
}, object : ThrowableConsumer() {
override fun accept(msg: String) {
mView.homeDataFail(msg)
}
})
}
fun disposeConfide() {
if (mConfideDisposable != null && !mConfideDisposable!!.isDisposed) {
mConfideDisposable?.dispose()
}
}
fun disposeConsult() {
if (mConsultDisposable != null && !mConsultDisposable!!.isDisposed) {
mConsultDisposable?.dispose()
}
}
fun disposeHome() {
if (mHomeDisposable != null && !mHomeDisposable!!.isDisposed) {
mHomeDisposable?.dispose()
}
}
/**
* 首页问答 - 点赞
*/
@SuppressLint("CheckResult")
override fun askZan(position: Int, index: Int, id: String) {
mModel.askZan(id)
.compose(RxUtils.netCheck())
.subscribeOn(Schedulers.io())
.map {}
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
}, object : ThrowableConsumer() {
override fun accept(msg: String) {
mView.homeDataFail(msg)
}
})
}
/**
* 首页问答 - 关注
*/
@SuppressLint("CheckResult")
override fun askFocus(position: Int, id: String) {
mModel.askFocus(id)
.compose(RxUtils.netCheck())
.subscribeOn(Schedulers.io())
.map {}
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
// view.askDataResponse(it!!, position)
}, object : ThrowableConsumer() {
override fun accept(msg: String) {
mView.homeDataFail(msg)
}
})
}
}
\ No newline at end of file
<resources>
<string name="app_name">m-home</string>
<string name="search_hint">搜索话题、咨询师姓名</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="NoTitleTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="android:windowActionBar">false</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="colorPrimary">@color/platform_main_theme_blue</item>
<item name="colorPrimaryDark">@color/platform_main_theme_blue</item>
<item name="colorAccent">@color/platform_main_theme_blue</item>
</style>
</resources>
\ No newline at end of file
package com.yidianling.home.adapter
import android.content.Context
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.yidianling.home.R
import com.yidianling.home.constract.YdlHomeViewHolderConstract
import com.yidianling.home.event.HomeImpl
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.model.bean.HomeAskBean
import com.yidianling.home.model.bean.HomeConfideBean
import com.yidianling.home.model.bean.HomeConsultBean
import com.yidianling.home.model.bean.HomePagerDataBean
import com.yidianling.home.ui.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 壹点零首页适配器
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class YdlHomeAdapter(private val mContext: Context,
private var homeEvent: HomeImpl,
private var list: ArrayList<HomePagerDataBean>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val mInflater: LayoutInflater = LayoutInflater.from(mContext)
/**
* 倾述item的position
*
*/
private var confidePosition = -1
/**
* 咨询条目 position
*/
private var consultPosition = -1
/**
* 倾述模块中tab上次选中的下标
*/
var confideSelectPosition = 0
/**
* 咨询模块中tab上次选中的下标
*/
var consultSelectPosition = 0
fun updateItems(list: MutableList<HomePagerDataBean>) {
if (null == this.list || this.list!!.isEmpty()) {
this.list = ArrayList()
} else {
this.list.clear()
}
this.list.addAll(list)
//重置标记位
confidePosition = -1
consultPosition = -1
notifyDataSetChanged()
}
/**
* 更新倾诉模块数据
*/
fun updateConfideData(data: HomeConfideBean, selectPosition: Int) {
if (confidePosition == -1) {
return
}
list[confidePosition].confideBean = data
this.confideSelectPosition = selectPosition
notifyItemChanged(confidePosition)
}
/**
* 更新咨询模块数据
*/
fun updateConsultData(data: HomeConsultBean, selectPosition: Int) {
if (consultPosition == -1) {
return
}
list[consultPosition].consultBean = data
this.consultSelectPosition = selectPosition
notifyItemChanged(consultPosition)
}
/**
* 更新问答模块数据
*/
fun updateAskData(data: HomeAskBean, position: Int) {
list[position].askBean = data
notifyItemChanged(position)
}
override fun getItemViewType(position: Int): Int {
if (position < list.size) {
return list[position].type!!
} else {
return YdlHomeViewHolderConstract.FOOTER_VIEW
}
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder {
when (viewType) {
//顶部预约专家,即时倾诉,心理测试按钮模块
YdlHomeViewHolderConstract.BUTTON_BANNER_VIEW -> {
return HomeButtonBannerViewHolder(HomeButtonBannerView(mContext, homeEvent))
}
//倾诉*排解模块
YdlHomeViewHolderConstract.CONFIDE_VIEW -> {
return HomeConfideViewHolder(HomeConfideView(mContext, homeEvent))
}
//课程*成长模块
YdlHomeViewHolderConstract.COURSE_VIEW -> {
return HomeCourseViewHolder(HomeCourseView(mContext, homeEvent))
}
//解忧*问答模块
YdlHomeViewHolderConstract.ASSUAGE_GRIEF_VIEW -> {
return HomeAssuageGriefViewHolder(HomeAssuageGriefView(mContext, homeEvent))
}
//文章*阅读模块
YdlHomeViewHolderConstract.ARTICLE_VIEW -> {
return HomeArticleViewHolder(HomeArticleView(mContext, homeEvent))
}
//咨询模块
YdlHomeViewHolderConstract.CONSULT_VIEW -> {
return HomeConsultViewHolder(HomeConsultView(mContext, homeEvent))
}
//测试模块
YdlHomeViewHolderConstract.TEST_VIEW -> {
return HomeTestViewHolder(HomeTestView(mContext, homeEvent))
}
//底部提示语模块
else -> {
val view = mInflater.inflate(R.layout.home_module_footer_view, parent, false)
return FooterViewViewHolder(view)
}
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
//顶部预约专家,即时倾诉,心理课堂,心理测试按钮模块
is HomeButtonBannerViewHolder -> {
holder.buttonBannerView.initData(list[position].headerBean?.homeSaleData,list[position].headerBean?.askCategoryData)
}
//倾诉*排解模块
is HomeConfideViewHolder -> {
holder.confideViewView.setTitle(list[position].headerBean?.listenCategoryDate, confideSelectPosition)
holder.confideViewView.setConfideExpertInfoView(list[position].confideBean?.body)
confidePosition = position
}
//课程*成长模块
is HomeCourseViewHolder -> {
holder.courseViewView.initData(list[position].courseBean?.list)
}
//解忧*问答模块
is HomeAssuageGriefViewHolder -> {
holder.assuageGriefViewView.initData(position, list[position].askBean?.data)
}
//文章*阅读模块
is HomeArticleViewHolder -> {
holder.articleViewView.initData(list[position].articleBean?.list)
}
//咨询模块
is HomeConsultViewHolder -> {
holder.consultView.setTitle(list[position].headerBean?.consultCategoryData, consultSelectPosition)
holder.consultView.setConsultInfoView(list[position].consultBean?.list,list[position].headerBean?.consultCategoryData?.get(consultSelectPosition))
consultPosition = position
}
//测试模块
is HomeTestViewHolder -> {
holder.testView.initData(list[position].testListBean)
}
}
}
override fun getItemCount(): Int {
return list.size
}
/**
* 顶部预约专家,即时倾诉,心理测试按钮模块 ViewHolder
*/
inner class HomeButtonBannerViewHolder(val buttonBannerView: HomeButtonBannerView) : RecyclerView.ViewHolder(buttonBannerView)
/**
* 咨询模块 ViewHolder
*/
inner class HomeConsultViewHolder(val consultView: HomeConsultView) : RecyclerView.ViewHolder(consultView)
/**
* 倾诉*排解模块 ViewHolder
*/
inner class HomeConfideViewHolder(val confideViewView: HomeConfideView) : RecyclerView.ViewHolder(confideViewView)
/**
* 课程*成长模块 ViewHolder
*/
inner class HomeCourseViewHolder(val courseViewView: HomeCourseView) : RecyclerView.ViewHolder(courseViewView)
/**
* 测试模块 ViewHolder
*/
inner class HomeTestViewHolder(val testView: HomeTestView) : RecyclerView.ViewHolder(testView)
/**
* 解忧*问答模块 ViewHolder
*/
inner class HomeAssuageGriefViewHolder(val assuageGriefViewView: HomeAssuageGriefView) : RecyclerView.ViewHolder(assuageGriefViewView)
/**
* 文章*阅读模块 ViewHolder
*/
inner class HomeArticleViewHolder(val articleViewView: HomeArticleView) : RecyclerView.ViewHolder(articleViewView)
/**
* 底部提示语模块 ViewHolder
*/
inner class FooterViewViewHolder(val footerView: View) : RecyclerView.ViewHolder(footerView)
}
\ No newline at end of file
package com.yidianling.home.constract
import android.app.Activity
import android.content.Context
import com.ydl.ydlcommon.data.http.BaseResponse
import com.ydl.ydlcommon.mvp.base.IModel
import com.ydl.ydlcommon.mvp.base.IPresenter
import com.ydl.ydlcommon.mvp.base.IView
import com.yidianling.home.constants.IHomeBaseContract
import com.yidianling.home.model.bean.*
import io.reactivex.Observable
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 心理咨询首页约束类
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class IHomeContract {
interface View : IHomeBaseContract.View {
/**
* 获取优惠券数据回调
*/
fun couponDataResponse(data: List<CouponBean>)
/**
* 领取优惠券回调
*/
fun receiveCouponResponse(data: BaseResponse<Any>)
/**
* 领取优惠券
*/
fun receiveCoupon(data: List<CouponBean>)
}
interface Presenter : IHomeBaseContract.Presenter<View> {
/**
* 获取优惠券信息
*/
fun prepareCoupon(activity: Activity)
/**
* 领取优惠券
*/
fun receiveCoupon(list:List<CouponBean>)
}
interface Model: IHomeBaseContract.Model {
/**
* 领取优惠券
*/
fun receiveCoupon(uid: String, couponIds: String): Observable<BaseResponse<Any>>
/**
* 获取优惠券
*/
fun getCoupons(uid: String): Observable<BaseResponse<List<CouponBean>>>
}
}
\ No newline at end of file
package com.yidianling.home.constract
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述:壹点零首页ViewHolder约束类
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class YdlHomeViewHolderConstract {
companion object {
/**
* 顶部ViewPager与分类模块
*/
val PAGER_BANNER_VIEW = 10001
/**
* 顶部预约专家,即时倾诉,心理测试按钮模块
*/
val BUTTON_BANNER_VIEW = 10002
/**
* 咨询模块
*/
val CONSULT_VIEW = 10003
/**
* 倾诉*排解模块
*/
val CONFIDE_VIEW = 10004
/**
* 课程*成长模块
*/
val COURSE_VIEW = 10005
/**
* 测试模块
*/
val TEST_VIEW = 10006
/**
* 解忧*问答模块
*/
val ASSUAGE_GRIEF_VIEW = 10007
/**
* 文章*阅读模块
*/
val ARTICLE_VIEW = 10008
/**
* 底部提示语模块
*/
val FOOTER_VIEW = 10009
}
}
\ No newline at end of file
package com.yidianling.home.dialog
import android.app.Activity
import android.app.Dialog
import android.os.Bundle
import com.ydl.webview.H5Params
import com.ydl.webview.NewH5Activity
import com.yidianling.home.R
import com.ydl.ydl_image.module.GlideApp
import com.ydl.ydl_router.manager.YDLRouterManager
import kotlinx.android.synthetic.xlzx.dialog_activity.*
import java.lang.ref.WeakReference
/**
* 活动弹窗
*/
class ActivityDialog : Dialog{
private var imgUrl :String?= null
private var linkUrl:String? = null
private var title: String? = null
private var mActivity: WeakReference<Activity>?= null
constructor(activit: Activity,imgUrl: String?,linkUrl: String?,title:String?):super(activit,R.style.activityDialog){
this.imgUrl = imgUrl
this.linkUrl = linkUrl
this.title = title
this.mActivity = WeakReference<Activity>(activit)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window.setBackgroundDrawableResource(android.R.color.transparent)
setContentView(R.layout.dialog_activity)
initView()
}
private fun initView(){
img_close.setOnClickListener{
this.dismiss()
}
img_activity.setOnClickListener{
//跳转
if (this.linkUrl!=null && this.linkUrl!!.startsWith("http")){
NewH5Activity.start(context, H5Params(this.linkUrl!!,null))
}else{
YDLRouterManager.router(this.linkUrl)
}
}
GlideApp.with(context).load(imgUrl).into(img_activity)
setCanceledOnTouchOutside(false)
setCancelable(false)
}
}
package com.yidianling.home.dialog
import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.view.Window
import com.ydl.ydl_image.module.GlideApp
import com.ydl.ydlcommon.utils.DisplayUtils
import com.yidianling.home.R
import kotlinx.android.synthetic.xlzx.dialog_guide_activity.*
import java.util.*
/**
* 首页活动引导弹窗
*/
class ActivityGuideDialog : Dialog{
private var imgUrl :String?= null
private var title:String? = null
private var marginTop: Int? = null
private var marginLeft: Int? = null
constructor(context: Context,imgUrl: String?,title: String?,marginTop : Int,marginLeft:Int):super(context,R.style.activityDialog){
this.imgUrl = imgUrl
this.title = title
this.marginTop = marginTop
this.marginLeft = marginLeft
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestWindowFeature(Window.FEATURE_NO_TITLE)
window.setBackgroundDrawableResource(android.R.color.transparent)
setContentView(R.layout.dialog_guide_activity)
initView()
}
private fun initView(){
if (marginTop==null){
marginTop = DisplayUtils.dp2px(context,135)
}
if (marginLeft==null){
marginLeft = DisplayUtils.dp2px(context,35)
}
c_body.setPadding(marginLeft!!,marginTop!!,0,0)
c_body.setOnClickListener {
dismiss()
}
tv_content.text = this.title
GlideApp.with(context).load(imgUrl).into(img_activity)
//3秒自动消失
Timer().schedule(object : TimerTask() {
override fun run() {
dismiss()
}
},3000)
}
}
\ No newline at end of file
package com.yidianling.home.event
import android.content.Context
import android.content.Intent
import android.graphics.drawable.AnimationDrawable
import android.net.Uri
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.RecyclerView
import android.text.TextUtils
import android.view.View
import android.widget.ImageView
import android.widget.RelativeLayout
import com.alibaba.android.arouter.launcher.ARouter
import com.ydl.media.audio.AudioPlayer
import com.ydl.media.audio.model.Music
import com.ydl.media.view.PlayTypeEnum
import com.ydl.media.view.PlayerFloatHelper
import com.ydl.media.view.PlayerFloatView
import com.ydl.webview.H5Params
import com.ydl.webview.NewH5Activity
import com.yidianling.home.R
import com.yidianling.home.constract.IHomeContract
import com.yidianling.home.model.bean.*
import com.yidianling.home.ui.view.CouponDialog
import com.ydl.ydl_router.manager.YDLRouterManager
import com.ydl.ydl_router.manager.YDLRouterParams
import com.ydl.ydl_router.util.YDLRouterParamsUrls
import com.ydl.ydlcommon.base.BaseActivity
import com.ydl.ydlcommon.base.config.HttpConfig
import com.ydl.ydlcommon.bean.ShareData
import com.ydl.ydlcommon.data.PlatformRamImpl
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlcommon.router.IYDLRouterConstant
import com.ydl.ydlcommon.utils.remind.ToastHelper
import com.ydl.ydlcommon.view.dialog.CommonDialog
import com.yidianling.router.RouterManager
import com.yidianling.router.im.IMRequestCallback
import com.yidianling.tests.api.service.ITestsApiService
import com.yidianling.user.api.service.IUserService
import org.json.JSONObject
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 首页点击事件实现类
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeImpl(context: Context, homeView: IHomeContract.View) : HomeBaseImpl(context, homeView), IHomeEvent {
private var lastVoiceView: ImageView? = null
private var floatViewClickListener: PlayerFloatView.FloatViewPlayListener? = null
override fun clickEnsure(list: List<CouponBean>): CouponDialog.OnClickEnsureListener {
return object : CouponDialog.OnClickEnsureListener {
override fun clickEnsure(status: Int) {
//立即领取
if (status == CouponDialog.STATUS_RECEIVER) {
mHomeView?.receiveCoupon(list)
}
//查看我的卡券
if (status == CouponDialog.STATUS_GET) {
ARouter.getInstance().build(IYDLRouterConstant.ROUTER_MINE_REDPACKET)
.withString("is_from_main", "1")
.navigation()
}
}
}
}
override fun confidePlayClick(voiceView: ImageView, bean: HomeConfideBean.BodyBean) {
val music = Music()
music.title = bean.confidedName
music.coverPath = bean.confidedIcon
AudioPlayer.get().singlePlay(music, false)
PlayerFloatHelper.playingType = PlayTypeEnum.PLAY_TYPE_CONFIDE
if (PlayerFloatHelper.isShow(mContext!!)) {
if (PlayerFloatHelper.playingType == PlayTypeEnum.PLAY_TYPE_CONFIDE) {
PlayerFloatHelper.removeView(mContext!!)
PlayerFloatHelper.show(mContext!!)
} else {
PlayerFloatHelper.setPlayingState(mContext!!)
}
} else {
mContext?.let { PlayerFloatHelper.show(it) }
}
stopPlayAnim()
var animationDrawable = voiceView?.getDrawable() as AnimationDrawable
animationDrawable.start()
lastVoiceView = voiceView
if (floatViewClickListener == null) {
floatViewClickListener = object : PlayerFloatView.FloatViewPlayListener {
override fun onStartClick() {
startPlayAnim()
}
override fun onPlayFinish() {
stopPlayAnim()
if (PlayerFloatHelper.isShow(mContext!!)) {
PlayerFloatHelper.removeView(mContext!!)
AudioPlayer.get().stopPlayer()
}
}
override fun onPauseClick() {
stopPlayAnim()
}
}
PlayerFloatHelper.addClickListener(floatViewClickListener as PlayerFloatView.FloatViewPlayListener)
}
}
private fun stopPlayAnim() {
if (lastVoiceView != null) {
var animationDrawable = lastVoiceView?.getDrawable() as AnimationDrawable
animationDrawable.stop()
animationDrawable.selectDrawable(3);
}
}
private fun startPlayAnim() {
if (lastVoiceView != null) {
var animationDrawable = lastVoiceView?.getDrawable() as AnimationDrawable
animationDrawable.start()
}
}
}
package com.yidianling.home.event
import android.support.v7.widget.RecyclerView
import android.widget.ImageView
import android.widget.RelativeLayout
import com.yidianling.home.model.bean.*
import com.yidianling.home.ui.view.CouponDialog
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 首页点击事件接口类
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
interface IHomeEvent {
/**
* 点击优惠券确定事件
*/
fun clickEnsure(list: List<CouponBean>): CouponDialog.OnClickEnsureListener
/**
* 咨询师音频点击播放
*/
fun confidePlayClick(voiceView:ImageView,bean: HomeConfideBean.BodyBean)
}
\ No newline at end of file
package com.cxzapp.yidianling_atk8.ui.homepager.http
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.data.http.BaseCommand
import com.ydl.ydlcommon.data.http.BaseResponse
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlnet.YDLHttpUtils
import com.yidianling.home.model.bean.*
import com.yidianling.user.api.service.IUserService
import io.reactivex.Observable
import okhttp3.MediaType
import okhttp3.RequestBody
/**
* @author jiucheng
* @描述:首页接口实现类
* @Copyright Copyright (c) 2018
* @Company 壹点灵
* @date 2018/8/22
*/
class HomeHttp private constructor() {
companion object {
fun getInstance(): HomeHttp {
return Holder.INSTANCE
}
}
object Holder {
val INSTANCE = HomeHttp()
}
private var homePagerApi: HomePagerApi? = null
private fun getHomePagerApi(): HomePagerApi {
if (homePagerApi == null) {
homePagerApi = YDLHttpUtils.obtainApi(HomePagerApi::class.java)
}
return homePagerApi!!
}
//领取优惠券
fun receiveCoupon(uid: String, couponIds: String): Observable<BaseResponse<Any>> {
val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), couponIds)
return getHomePagerApi().receiveCoupon(uid, body)
}
//获取优惠券
// applyUsers 用户
// applyEnds 用户版
fun getCoupons(uid: String): Observable<BaseResponse<List<CouponBean>>> {
return getHomePagerApi().getCoupons(uid, "1", "3")
}
}
\ No newline at end of file
package com.cxzapp.yidianling_atk8.ui.homepager.http
import com.ydl.ydlcommon.base.BaseApp
import com.ydl.ydlcommon.base.config.YDL_DOMAIN
import com.ydl.ydlcommon.base.config.YDL_DOMAIN_JAVA
import com.ydl.ydlcommon.base.config.YDL_DOMAIN_JAVA_URL
import com.ydl.ydlcommon.data.PlatformDataManager
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.data.http.BaseResponse
import com.yidianling.home.model.bean.*
import com.yidianling.common.tools.RxDeviceTool
import io.reactivex.Observable
import okhttp3.RequestBody
import retrofit2.http.*
/**
* @author jiucheng
* @描述:首页接口api
* @Copyright Copyright (c) 2018
* @Company 壹点灵
* @date 2018/8/22
*/
interface HomePagerApi {
//领取优惠券
@POST("marketing/coupon/{uid}/receive")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA_URL)
fun receiveCoupon(@Path("uid") uid: String, @Body body: RequestBody): Observable<BaseResponse<Any>>
//获取优惠券
@GET("marketing/coupon/{uid}/obtain")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA_URL)
fun getCoupons(
@Path("uid") uid: String, @Query("applyUsers") applyUsers: String, @Query(
"applyEnds"
) applyEnds: String
): Observable<BaseResponse<List<CouponBean>>>
}
\ No newline at end of file
package com.yidianling.home.listener
import android.support.design.widget.TabLayout
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.yidianling.home.adapter.YdlHomeAdapter
import com.yidianling.home.constract.YdlHomeViewHolderConstract
import com.yidianling.common.tools.RxImageTool
/**
* @author yuanwai
* @描述:悬浮按钮监听事件
* @Copyright Copyright (c) 2018
* @Company 壹点灵
* @date 2018/9/25
*/
class HomeConfideRecyleSuspendListener : RecyclerView.OnScrollListener() {
private var mCurrentPosition = 0
private var mSuspensionHeight: Int = RxImageTool.dip2px(51f)
private var filterView: LinearLayout? = null
private var adapter: YdlHomeAdapter? = null
fun setFilterView(filterView: LinearLayout) {
this.filterView = filterView
}
fun setSectionAdapter(adapter: YdlHomeAdapter) {
this.adapter = adapter
}
override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
if (null != filterView) {
mSuspensionHeight = filterView!!.height
}
}
override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if (null == adapter) {
return
}
val manager = recyclerView!!.layoutManager as LinearLayoutManager
if (mCurrentPosition != manager.findFirstVisibleItemPosition()) {
mCurrentPosition = manager.findFirstVisibleItemPosition()
}
// LogUtil.e("http----------------type=" + adapter!!.getItemViewType(mCurrentPosition))
if (adapter!!.getItemViewType(mCurrentPosition) == YdlHomeViewHolderConstract.CONFIDE_VIEW) {
var view = manager.findViewByPosition(mCurrentPosition)
if (view != null) {
if (view is ViewGroup) {
if (view.getChildAt(1) is TabLayout) {
var tablayout = view.getChildAt(1)
var location = IntArray(2)
tablayout.getLocationOnScreen(location)
if (location[1] - RxImageTool.dip2px(40f) <= mSuspensionHeight) {
filterView!!.visibility = View.VISIBLE
} else {
filterView!!.visibility = View.INVISIBLE
}
}
}
}
var nextView = manager.findViewByPosition(mCurrentPosition + 1)
if (nextView != null) {
if (nextView.top <= (mSuspensionHeight + RxImageTool.dip2px(41f))) {
filterView!!.visibility = View.INVISIBLE
}
}
} else {
filterView!!.visibility = View.INVISIBLE
}
}
}
\ No newline at end of file
package com.yidianling.home.model
import com.cxzapp.yidianling_atk8.ui.homepager.http.HomeHttp
import com.ydl.ydlcommon.base.config.HttpConfig
import com.ydl.ydlcommon.data.http.BaseResponse
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlcommon.mvp.base.BaseModel
import com.yidianling.home.constract.IHomeContract
import com.yidianling.home.model.bean.*
import io.reactivex.Observable
import okhttp3.MediaType
import okhttp3.RequestBody
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述:
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeModelImpl: BaseHomeModelImpl(), IHomeContract.Model {
//领取优惠券
override fun receiveCoupon(uid: String, couponIds: String): Observable<BaseResponse<Any>> {
return HomeHttp.getInstance().receiveCoupon(uid, couponIds)
}
//获取优惠券
override fun getCoupons(uid: String): Observable<BaseResponse<List<CouponBean>>> {
return HomeHttp.getInstance().getCoupons(uid)
}
}
\ No newline at end of file
package com.yidianling.home.presenter
import android.annotation.SuppressLint
import android.app.Activity
import android.os.Handler
import android.text.TextUtils
import com.google.gson.Gson
import com.ydl.ydlcommon.base.BaseApp
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlcommon.data.http.ThrowableConsumer
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlcommon.utils.LogUtil
import com.ydl.ydlcommon.utils.SharedPreferencesEditor
import com.ydl.ydlcommon.utils.YDLCacheUtils
import com.yidianling.common.tools.RxAppTool
import com.yidianling.consultant.api.IConsultantService
import com.yidianling.home.constract.IHomeContract
import com.yidianling.home.constract.YdlHomeViewHolderConstract
import com.yidianling.home.model.HomeModelImpl
import com.yidianling.home.model.bean.*
import com.yidianling.home.utils.HomeLogPrinter
import com.yidianling.user.api.service.IUserService
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Action
import io.reactivex.functions.Consumer
import io.reactivex.schedulers.Schedulers
import java.text.SimpleDateFormat
import java.util.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述:
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class HomePresenterImpl : BaseHomePresenterImpl<IHomeContract.View, IHomeContract.Model>(),
IHomeContract.Presenter {
override fun createModel(): IHomeContract.Model {
return HomeModelImpl()
}
private var hasRequestCoupon = false
override fun saveTempData(list: MutableList<HomePagerDataBean>) {
val homeBean = HomePagerDataBean()
for (dataBean in list) {
when (dataBean.type) {
YdlHomeViewHolderConstract.PAGER_BANNER_VIEW -> {
homeBean.headerBean = dataBean.headerBean
dataBean.headerBean?.keywordData?.let {
ModularServiceManager.provide(IConsultantService::class.java)
.setHotSearch(it)
}
}
//BUTTON_BANNER_VIEW的数据与PAGER_BANNER_VIEW一致,不需要再次设置
// YdlHomeViewHolderConstract.BUTTON_BANNER_VIEW -> {
// homeBean.headerBean = dataBean.headerBean
// }
YdlHomeViewHolderConstract.CONSULT_VIEW -> {
homeBean.headerBean = dataBean.headerBean
homeBean.consultBean = dataBean.consultBean
}
YdlHomeViewHolderConstract.CONFIDE_VIEW -> {
homeBean.headerBean = dataBean.headerBean
homeBean.confideBean = dataBean.confideBean
}
YdlHomeViewHolderConstract.COURSE_VIEW -> {
homeBean.courseBean = dataBean.courseBean
}
YdlHomeViewHolderConstract.TEST_VIEW -> {
homeBean.testListBean = dataBean.testListBean
}
YdlHomeViewHolderConstract.ASSUAGE_GRIEF_VIEW -> {
mHomeAskBean = dataBean.askBean
homeBean.askBean = dataBean.askBean
}
YdlHomeViewHolderConstract.ARTICLE_VIEW -> {
homeBean.articleBean = dataBean.articleBean
}
}
}
homeTempData = homeBean
}
override fun refreshHomeData() {
val homeItemFromTempData = getHomeItemFromTempData(
HomeHeaderBean(true),
YdlHomeViewHolderConstract.PAGER_BANNER_VIEW
)
mConsultType =
if (homeItemFromTempData.headerBean?.listenCategoryDate == null || homeItemFromTempData.headerBean?.listenCategoryDate!!.isEmpty()) {
"1"
} else {
homeItemFromTempData.headerBean?.consultCategoryData!![0].id.toString()
}
mConfideType = ""
mView.resetModuleTabPosition()
loadHomeData()
}
override fun getHomeItemFromTempData(
dataBean: HomeItemBaseBean,
type: Int
): HomePagerDataBean {
val item = HomePagerDataBean(type)
when (type) {
YdlHomeViewHolderConstract.PAGER_BANNER_VIEW -> {
item.headerBean =
if (dataBean.isRealEmpty || dataBean !is HomeHeaderBean) homeTempData.headerBean else dataBean
}
YdlHomeViewHolderConstract.BUTTON_BANNER_VIEW -> {
item.headerBean =
if (dataBean.isRealEmpty || dataBean !is HomeHeaderBean) homeTempData.headerBean else dataBean
}
YdlHomeViewHolderConstract.CONSULT_VIEW -> {
item.consultBean =
if (dataBean.isRealEmpty || dataBean !is HomeConsultBean) homeTempData.consultBean else dataBean
item.headerBean = homeTempData.headerBean
}
YdlHomeViewHolderConstract.CONFIDE_VIEW -> {
item.confideBean =
if (dataBean.isRealEmpty || dataBean !is HomeConfideBean) homeTempData.confideBean else dataBean
item.headerBean = homeTempData.headerBean
}
YdlHomeViewHolderConstract.COURSE_VIEW -> {
item.courseBean =
if (dataBean.isRealEmpty || dataBean !is HomeCourseBean) homeTempData.courseBean else dataBean
}
YdlHomeViewHolderConstract.TEST_VIEW -> {
item.testListBean =
if (dataBean.isRealEmpty || dataBean !is HomeTestBean) homeTempData.testListBean else dataBean.testItemList
}
YdlHomeViewHolderConstract.ASSUAGE_GRIEF_VIEW -> {
item.askBean =
if (dataBean.isRealEmpty || dataBean !is HomeAskBean) homeTempData.askBean else dataBean
mHomeAskBean = item.askBean
}
YdlHomeViewHolderConstract.ARTICLE_VIEW -> {
item.articleBean =
if (dataBean.isRealEmpty || dataBean !is HomeArticleBean) homeTempData.articleBean else dataBean
}
}
return item
}
/**
* 获取首页数据请求
*/
@SuppressLint("CheckResult")
override fun loadHomeData() {
disposeHome()
val homeList: MutableList<HomePagerDataBean> = mutableListOf()
LogUtil.d("mConsultType-loadHomeData:$mConsultType")
Observable.mergeArray(
mModel.headerRequest().map { it ->
//首页头部数据 分类 & Banner
homeList.add(
getHomeItemFromTempData(
it,
YdlHomeViewHolderConstract.PAGER_BANNER_VIEW
)
)
homeList.add(
getHomeItemFromTempData(
it,
YdlHomeViewHolderConstract.BUTTON_BANNER_VIEW
)
)
mView.homeHeadResponse(it)
//获取咨询分类后,再次请求咨询模块数据,防止出现默认分类为空,数据不对
if (it.consultCategoryData != null && it.consultCategoryData!!.isNotEmpty()) {
//咨询分类和缓存分类不一致,重新加载咨询列表数据
if (it.consultCategoryData!![0].id.toString() != mConsultType) {
getConsultData("${it.consultCategoryData!![0].id}", 0)
}
}
// homeList.add(HomePagerDataBean(YdlHomeViewHolderConstract.BUTTON_BANNER_VIEW))
//保存热门搜索列表
it.keywordData?.let {
ModularServiceManager.provide(IConsultantService::class.java).setHotSearch(it)
}
},
mModel.consultRequest(mConsultType).map {
//首页咨询数据
homeList.add(getHomeItemFromTempData(it, YdlHomeViewHolderConstract.CONSULT_VIEW))
},
//GoodType为空 获取默认类型
mModel.confideRequest(mConfideType).map {
//首页倾述数据
homeList.add(getHomeItemFromTempData(it, YdlHomeViewHolderConstract.CONFIDE_VIEW))
},
mModel.courseRequest().map {
//首页课程数据
homeList.add(getHomeItemFromTempData(it, YdlHomeViewHolderConstract.COURSE_VIEW))
},
mModel.testRequest().map {
//首页测试数据
val homeTestBean = HomeTestBean()
homeTestBean.testItemList = it.data
homeList.add(
getHomeItemFromTempData(
homeTestBean,
YdlHomeViewHolderConstract.TEST_VIEW
)
)
},
mModel.askRequest().map {
//首页问答数据
homeList.add(
getHomeItemFromTempData(
it,
YdlHomeViewHolderConstract.ASSUAGE_GRIEF_VIEW
)
)
},
mModel.articleRequest().map {
//首页文章数据
homeList.add(getHomeItemFromTempData(it, YdlHomeViewHolderConstract.ARTICLE_VIEW))
homeList.add(HomePagerDataBean(YdlHomeViewHolderConstract.FOOTER_VIEW))
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {}, object : ThrowableConsumer() {
override fun accept(msg: String) {
mView.homeDataFail(msg)
}
}, Action {
homeList.sortWith(compareBy { it.type })
//更新本地缓存数据,这边顶部数据保存了两份,一个10001,一个10002,防止第二次进来读取的时候homeDataResponse回调中的remove(0)把10002删除
SharedPreferencesEditor.putString(CACHE_HOME_PAGER_DATA, Gson().toJson(homeList))
mView.homeDataResponse(homeList)
SharedPreferencesEditor.putString(IS_NEW_CACHE_HOME_PAGER_DATA, true.toString())
SharedPreferencesEditor.putString(
HOME_PAGER_DATA_CACHE_VERISON,
RxAppTool.getAppVersionCode(BaseApp.getApp()).toString()
)
HomeLogPrinter.printLongLog(
HomePresenterImpl::class.java.simpleName,
Gson().toJson(homeList)
)
})
}
/**
* 领取优惠券
*/
@SuppressLint("CheckResult")
override fun receiveCoupon(list: List<CouponBean>) {
val uid = ModularServiceManager.provide(IUserService::class.java).getUserInfo()?.uid ?: ""
val couponIds = ArrayList<String>()
for (bean in list) {
couponIds.add(bean.couponId ?: "")
}
val bean = CouponReceiveBean()
bean.couponIds = couponIds
val couponIdsStr = Gson().toJson(bean)
mModel.receiveCoupon(uid, couponIdsStr)
.compose(RxUtils.netCheck())
.subscribeOn(Schedulers.io())
.doOnSubscribe { mView.showHomeProgress() }
.doAfterTerminate { mView.dismissHomeProgress() }
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
mView.receiveCouponResponse(it)
}, object : ThrowableConsumer() {
override fun accept(msg: String) {
mView.homeDataFail(msg)
}
})
}
override fun prepareCoupon(activity: Activity) {
//判断是否登录 以及本次app启动后是否已经请求过
if (ModularServiceManager.provide(IUserService::class.java).isLogin() && !hasRequestCoupon) {
Handler().postDelayed({
//优惠券逻辑
if (compareCouponTime()) {
getCouponData()
}
}, 2000)
}
}
@SuppressLint("CheckResult")
private fun getCouponData() {
val uid = ModularServiceManager.provide(IUserService::class.java).getUserInfo()?.uid ?: ""
mModel.getCoupons(uid)
.compose(RxUtils.netCheck())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
hasRequestCoupon = true
val simpleFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")//如2016-08-10
val time = System.currentTimeMillis()
val date = Date()
date.time = time
val nowTime = simpleFormat.format(date)
YDLCacheUtils.saveCouponTime(uid, nowTime);
if (it?.data != null && !it.data.isEmpty()) {
mView.couponDataResponse(it.data)
}
}, object : ThrowableConsumer() {
override fun accept(msg: String) {
mView.homeDataFail(msg)
}
})
}
/**
* 对比上次获取优惠券时间,若时间差超过一天,则再次请求,否则不获请求
*/
@SuppressLint("SimpleDateFormat")
private fun compareCouponTime(): Boolean {
val simpleFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")//如2016-08-10
val uid = ModularServiceManager.provide(IUserService::class.java).getUserInfo()?.uid
val last = YDLCacheUtils.getCouponTime(uid);
if (TextUtils.isEmpty(last)) {
//还没有获取过优惠券,直接请求数据
return true
} else {
val time = System.currentTimeMillis()
val date = Date()
date.time = time
val nowTime = simpleFormat.format(date)
return !TextUtils.equals(last.substring(0, 10), nowTime.substring(0, 10))
}
}
inner class CouponReceiveBean {
var couponIds: List<String>? = null
}
}
\ No newline at end of file
package com.yidianling.home.ui.behavior;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.CoordinatorLayout;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.OverScroller;
import android.widget.RelativeLayout;
import com.ydl.ydlcommon.utils.ColorCalculateUtils;
import com.ydl.ydlcommon.utils.DisplayUtils;
import com.yidianling.home.ui.scrollView.DisInterceptNestedScrollView;
/**
* Created by haorui on 2019/3/2.
* Des:
*/
public class HomeAppBarLayoutBehavior extends AppBarLayout.Behavior {
private static final String TAG = "overScroll";
private static final String TAG_TOOLBAR = "toolbar";
private static final String TAG_TOOLBAR_BG = "toolbar_bg";
private static final String TAG_MIDDLE_BUT = "middle_but_layout";
private static final String TAG_SEARCH_INPUT = "tag_search_input";
private static final String TAG_SEARCH_INPUT_BG = "tag_search_input_bg";
private static final String TAG_SEARCH_INPUT_EDIT = "tag_search_input_edit";
private static final String TAG_SEARCH_INPUT_IMG = "tag_search_input_img";
private View mTargetView;
private View mToolBarBg;
private ViewGroup middleLayout;//咨询按钮布局
private RelativeLayout inputLayout;//输入框布局
private boolean isRecovering = false;//是否正在自动回弹中
private float INPUT_LEFT_OFFSET ;//52dp - 15dp
private float INPUT_RIGHT_OFFSET ;//38dp - 15dp
private float INPUT_HEIGHT_OFFSET ;//44dp - 32dp
private float INPUT_SEARCH_IMAGE_OFFSET ;//15dp - 10dp
private float INPUT_SEARCH_IMAGE_ORIGIN_OFFSET;//15dp
private float INPUT_ORIGIN_HEIGHT;
private int inputOriginMargin;
private View inputLayoutBg;
private GradientDrawable inputBgDrawable;
private EditText inputLayoutEdit;
private ImageView inputLayoutImg;
private OverScroller mScroller1;
private float mInputLastScale ;
private CoordinatorLayout.LayoutParams mLayoutParams;
private RelativeLayout.LayoutParams mLayoutImageParams;
public HomeAppBarLayoutBehavior() {
}
public HomeAppBarLayoutBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
INPUT_LEFT_OFFSET = DisplayUtils.dp2px(context,23);
INPUT_RIGHT_OFFSET = DisplayUtils.dp2px(context,37);
INPUT_HEIGHT_OFFSET = DisplayUtils.dp2px(context,11);
INPUT_ORIGIN_HEIGHT = DisplayUtils.dp2px(context,44);
INPUT_SEARCH_IMAGE_OFFSET = DisplayUtils.dp2px(context,4);
INPUT_SEARCH_IMAGE_ORIGIN_OFFSET = DisplayUtils.dp2px(context,10);
}
@Override
public boolean onLayoutChild(CoordinatorLayout parent, AppBarLayout abl, int layoutDirection) {
boolean handled = super.onLayoutChild(parent, abl, layoutDirection);
if (mToolBarBg == null) {
mToolBarBg = (View) parent.findViewWithTag(TAG_TOOLBAR_BG);
}
if (middleLayout == null) {
middleLayout = (ViewGroup) parent.findViewWithTag(TAG_MIDDLE_BUT);
}
if (inputLayout == null) {
inputLayout = (RelativeLayout) parent.findViewWithTag(TAG_SEARCH_INPUT);
inputLayoutBg = parent.findViewWithTag(TAG_SEARCH_INPUT_BG);
inputLayoutEdit = (EditText) parent.findViewWithTag(TAG_SEARCH_INPUT_EDIT);
inputLayoutImg = (ImageView) parent.findViewWithTag(TAG_SEARCH_INPUT_IMG);
inputBgDrawable = (GradientDrawable) inputLayoutBg.getBackground();
mLayoutParams = (CoordinatorLayout.LayoutParams) inputLayout.getLayoutParams();
inputOriginMargin = mLayoutParams.leftMargin;
mLayoutImageParams = (RelativeLayout.LayoutParams) inputLayoutImg.getLayoutParams();
}
if (mTargetView == null) {
mTargetView = parent.findViewWithTag(TAG);
if (mTargetView != null) {
initial(abl);
}
}
abl.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public final void onOffsetChanged(AppBarLayout appBarLayout, int i) {
float scale = Float.valueOf(Math.abs(i)) / Float.valueOf(appBarLayout.getTotalScrollRange());
mToolBarBg.setAlpha( scale);
float leftMargin = inputOriginMargin + (INPUT_LEFT_OFFSET*scale);
float rightMargin = inputOriginMargin + (INPUT_RIGHT_OFFSET*scale);
mLayoutParams.setMargins((int)leftMargin,0,(int) rightMargin,0);
mLayoutParams.height = (int) (INPUT_ORIGIN_HEIGHT - (scale*INPUT_HEIGHT_OFFSET));
inputLayout.setLayoutParams(mLayoutParams);
float imageRightMargin = INPUT_SEARCH_IMAGE_ORIGIN_OFFSET - (INPUT_SEARCH_IMAGE_OFFSET*scale);
mLayoutImageParams.setMargins((int)INPUT_SEARCH_IMAGE_ORIGIN_OFFSET,0,(int) imageRightMargin,0);
inputLayoutImg.setLayoutParams(mLayoutImageParams);
//设置圆角
inputBgDrawable.setCornerRadius(12+(40*scale));
if(Math.abs(scale-mInputLastScale)>0.25) {
//设置字体/图标颜色 4次
inputLayoutEdit.setHintTextColor(Color.parseColor(ColorCalculateUtils.calculateColor("#FFB3B3B3","#A4999999",scale)));
inputLayoutImg.setColorFilter(Color.parseColor(ColorCalculateUtils.calculateColor("#FF999999","#FFB3B3B3",scale)));
// inputLayoutEdit.setTextColor(Color.parseColor(ColorCalculateUtils.calculateColor("#FF444444","#A4FFFFFF",scale)));
mInputLastScale = scale;
}
// inputLayoutImg.setAlpha((float) (1- (0.4*scale)));
}
});
return handled;
}
@Override
public boolean onStartNestedScroll(CoordinatorLayout parent, AppBarLayout child, View directTargetChild, View target, int nestedScrollAxes, int type) {
if (target instanceof DisInterceptNestedScrollView)
return true;//middleLayout
return super.onStartNestedScroll(parent, child, directTargetChild, target, nestedScrollAxes,type);
}
private void initial(AppBarLayout abl) {
abl.setClipChildren(false);
}
}
\ No newline at end of file
package com.yidianling.home.ui.fragment
import android.app.Dialog
import android.os.Build
import android.support.design.widget.CollapsingToolbarLayout
import android.support.design.widget.CoordinatorLayout
import android.support.v4.content.ContextCompat
import android.support.v4.widget.SwipeRefreshLayout
import android.support.v7.widget.LinearLayoutManager
import android.text.TextUtils
import android.view.View
import android.widget.RelativeLayout
import com.ydl.webview.H5Params
import com.ydl.webview.NewH5Activity
import com.ydl.ydl_image.module.GlideApp
import com.ydl.ydl_router.manager.YDLRouterManager
import com.ydl.ydlcommon.base.BaseMvpFragment
import com.ydl.ydlcommon.data.http.BaseResponse
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlcommon.utils.*
import com.ydl.ydlcommon.utils.remind.ToastHelper
import com.ydl.ydlcommon.view.banner.GlideImageLoader
import com.yidianling.consultant.api.IConsultantService
import com.yidianling.home.R
import com.yidianling.home.adapter.YdlHomeAdapter
import com.yidianling.home.constract.IHomeContract
import com.yidianling.home.dialog.ActivityDialog
import com.yidianling.home.dialog.ActivityGuideDialog
import com.yidianling.home.event.HomeImpl
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.listener.HomeConfideRecyleSuspendListener
import com.yidianling.home.model.bean.*
import com.yidianling.home.presenter.HomePresenterImpl
import com.yidianling.home.ui.utils.Double11ActivityManagerUtils
import com.yidianling.home.ui.view.CouponDialog
import com.yidianling.user.api.service.IUserService
import kotlinx.android.synthetic.xlzx.fragment_home_module.*
import kotlinx.android.synthetic.xlzx.layout_home_module_content.*
import kotlinx.android.synthetic.xlzx.layout_home_module_head_bg.*
import kotlinx.android.synthetic.xlzx.layout_home_module_input.*
import kotlinx.android.synthetic.xlzx.layout_home_module_toolbar.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 壹点灵首页fragment
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/12
*/
class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterImpl>(),
IHomeContract.View,
SwipeRefreshLayout.OnRefreshListener {
private var adapter: YdlHomeAdapter? = null
private var homeEvent: HomeImpl? = null
private var dialog: CouponDialog? = null
//双11活动弹窗
private var aa: Dialog? = null
/**
* tablayou上次选中的tab下标
*/
private var confideLastSelectPosition = 0
/**
* 咨询tablayout上次选中的西边
*/
private var consultLastSelectPosition = 0
/**
* 悬浮tablayout监听事件
*/
private var scrollListner: HomeConfideRecyleSuspendListener? = null
override fun layoutResId(): Int {
return R.layout.fragment_home_module
}
override fun initDataAndEvent() {
homeEvent = HomeImpl(activity, this)
initView()
initAdapter()
}
private fun initAdapter() {
mPresenter?.localHomeData(this.context, "home_data_xlzx.json")
adapter = YdlHomeAdapter(context, homeEvent!!, ArrayList())
val layoutManager = LinearLayoutManager(context)
home_module_fragment_recycler.layoutManager = layoutManager
home_module_fragment_recycler.adapter = adapter
scrollListner = HomeConfideRecyleSuspendListener()
home_module_fragment_recycler.addOnScrollListener(scrollListner)
}
private fun initView() {
home_swipe_refresh_layout.setOnRefreshListener(this)
home_swipe_refresh_layout.setColorSchemeColors(ContextCompat.getColor(context, R.color.platform_main_theme_blue))
home_swipe_refresh_layout.setProgressViewOffset(false, 0, 200)
home_swipe_refresh_layout.isEnabled = false
etSearch.setOnClickListener { homeEvent?.searchTvClick("") }
val inputLayoutParams = ll_search.layoutParams as CoordinatorLayout.LayoutParams
val inputOriginMargin = inputLayoutParams.leftMargin
var inputOffset = DisplayUtils.dp2px(context, 20).toFloat()
appbar_layout.addOnOffsetChangedListener { appBarLayout, i ->
home_swipe_refresh_layout.isEnabled = i >= 0
val scale = java.lang.Float.valueOf(Math.abs(i).toFloat())!! / java.lang.Float.valueOf(appBarLayout.totalScrollRange.toFloat())!!
view_search_toolbar_bg.alpha = scale
val leftMargin = inputOriginMargin - inputOffset * scale
val rightMargin = inputOriginMargin - inputOffset * scale
inputLayoutParams.setMargins(leftMargin.toInt(), 0, rightMargin.toInt(), 0)
ll_search.layoutParams = inputLayoutParams
val zheZhaoAlpha = ((1 - (0.2 * scale)).toFloat())
//以下判断是因为toolbar和遮罩层拦截住了点击事件,导致banner不好点击
if (zheZhaoAlpha == 1f) {
title_layout.visibility = View.GONE
toolbar.visibility = View.GONE
} else {
title_layout.visibility = View.VISIBLE
toolbar.visibility = View.VISIBLE
}
view_search_input_bg.alpha = zheZhaoAlpha
}
initStatus()
}
/**
* 初始化状态栏位置
*/
private fun initStatus() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4以下不支持状态栏变色
val statusBarHeight = StatusBarUtils.getStatusBarHeight(activity)
var homeTitleBarHeight = resources.getDimension(R.dimen.home_title_bar_height)
val lp1 = view_search_toolbar_bg.layoutParams as RelativeLayout.LayoutParams
lp1.height = (homeTitleBarHeight + statusBarHeight).toInt()
view_search_toolbar_bg.layoutParams = lp1
val lp2 = toolbar.layoutParams as CollapsingToolbarLayout.LayoutParams
lp2.topMargin = statusBarHeight
toolbar.layoutParams = lp2
}
}
override fun initDataAndEventLazy() {
}
override fun createPresenter(): HomePresenterImpl {
return HomePresenterImpl()
}
override fun onRefresh() {
home_swipe_refresh_layout.isRefreshing = true
mPresenter?.refreshHomeData()
}
override fun resetModuleTabPosition() {
adapter?.confideSelectPosition = 0
adapter?.consultSelectPosition = 0
}
/**
* 获取倾述列表数据
* @param type 倾述类型
* @param selectPosition 选中的position
*/
override fun getConfideData(type: String, selectPosition: Int) {
confideLastSelectPosition = selectPosition
mPresenter?.getConfideData(type, selectPosition)
}
override fun getConsultData(type: String, selectPosition: Int) {
consultLastSelectPosition = selectPosition
mPresenter?.getConsultData(type, selectPosition)
}
override fun homeHeadResponse(homeHeaderBean: HomeHeaderBean) {
//展示活动数据
val act = homeHeaderBean.activityResponse
if (act != null) {
if (!TextUtils.isEmpty(act.imageUrl)) {
img_ad.visibility = View.VISIBLE
GlideApp.with(this).load(act.imageUrl).into(img_ad)
img_ad.setOnClickListener {
if (Utils.isFastClick()) {
//防止连击
return@setOnClickListener
}
if (act.btnLinkurl != null && act.btnLinkurl!!.startsWith("http")) {
NewH5Activity.start(activity, H5Params(act.btnLinkurl!!, null))
} else {
YDLRouterManager.router(act.btnLinkurl)
}
}
} else {
img_ad.visibility = View.GONE
}
if (!TextUtils.isEmpty(act.imageBanner)) {
val va = SharedPreferencesEditor.getString(act.imageBanner)
if (TextUtils.equals("yes", va)) {
//已经显示过,不再弹出
return
}
}
if (!ModularServiceManager.provide(IUserService::class.java).isLogin()) {
//未登录不显示
return
}
//如果是首次注册,会有新手礼包弹窗,则不显示此弹窗
if (Double11ActivityManagerUtils.notShowDouble11Activity) {
return
}
if (!TextUtils.isEmpty(act.imageBanner)) {
//展示弹窗
if (aa == null) {
aa = ActivityDialog(activity, act.imageBanner, act.linkUrl, act.title)
aa?.show()
aa?.setOnDismissListener {
if (!TextUtils.isEmpty(act.title)){
img_ad.post {
val heig = StatusBarUtils.getStatusBarHeight(context)
var location = IntArray(2)
img_ad.getLocationInWindow(location)
ActivityGuideDialog(activity, act.imageUrl, act.title, location[1] - heig, location[0]).show()
}
}
}
Double11ActivityManagerUtils.notShowDouble11Activity = false
}
//仅展示一次,以后不再展示
SharedPreferencesEditor.putString(act.imageBanner, "yes")
}
}
}
override fun homeDataResponse(list: MutableList<HomePagerDataBean>) {
home_swipe_refresh_layout.isRefreshing = false
//更新首页数据
initHeader(list)
//移除header条目
list.removeAt(0)
adapter?.updateItems(list)
//每次全局更新后重置下标位
confideLastSelectPosition = 0
consultLastSelectPosition = 0
}
private fun initHeader(list: MutableList<HomePagerDataBean>) {
var headerBean = list[0].headerBean;
// homeEvent?.let { home_category_view.setEvent(it) };
// home_category_view.initData(headerBean?.askCategoryData)
var focusListBean = headerBean?.focusList;
//临时缓存集合
val cacheList = ArrayList<HomeHeaderBean.FocusListBean>()
if (null != focusListBean && focusListBean.isNotEmpty()) {
var imageViews = ArrayList<String>()
//产品说取前8个
if (focusListBean.size > 8) {
cacheList.addAll(focusListBean.subList(0, 8))
} else {
cacheList.addAll(focusListBean)
}
for (item in cacheList) {
imageViews.add(item.imageUrl!!)
}
banner_search.setImageLoader(GlideImageLoader(R.drawable.home_module_image_default_back)).setImages(imageViews).start()
banner_search.setOnBannerListener {
homeEvent?.bannerClick(cacheList!![it])
YdlBuryPointUtil.sendClick("ydl-xinlizixun-home-banner$it", "${cacheList[it].imageUrl}")
}
banner_search.setIndicatorBottomPadding(20)
}
}
override fun confideDataResponse(data: HomeConfideBean, selectPosition: Int) {
//更新倾述列表数据
adapter?.updateConfideData(data, selectPosition)
}
override fun consultDataResponse(data: HomeConsultBean, selectPosition: Int) {
//更新咨询列表数据
adapter?.updateConsultData(data, selectPosition)
}
override fun askDataResponse(data: HomeAskBean, position: Int) {
//更新问答模块数据
adapter?.updateAskData(data, position)
}
override fun homeDataFail(msg: String) {
if (home_swipe_refresh_layout != null) {
home_swipe_refresh_layout.isRefreshing = false
}
ToastHelper.show(msg)
}
override fun couponDataResponse(data: List<CouponBean>) {
showCouponDialog(data)
}
private fun showCouponDialog(data: List<CouponBean>) {
if (dialog == null) {
dialog = CouponDialog(activity, data, homeEvent?.clickEnsure(data))
}
if (!dialog!!.isShowing) {
dialog?.show()
}
}
override fun receiveCoupon(data: List<CouponBean>) {
mPresenter?.receiveCoupon(data)
}
override fun receiveCouponResponse(data: BaseResponse<Any>) {
if (data.code == 200) {
dialog?.updateStatus(CouponDialog.STATUS_GET)
} else {
ToastHelper.show(data.msg)
}
}
override fun askZan(position: Int, index: Int, id: String) {
mPresenter?.askZan(position, index, id)
}
override fun askFocus(position: Int, id: String) {
mPresenter?.askFocus(position, id)
}
override fun showHomeProgress() {
showHomeProgress()
}
override fun showRefreshLayout() {
home_swipe_refresh_layout.isRefreshing = true
}
override fun dismissHomeProgress() {
dismissHomeProgress()
}
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if (isVisibleToUser && isResumed) {
showConsultAssistantDialog()
} else {
hideConsultAssistantDialog()
}
if (isVisibleToUser && isResumed) {
onResume()
}
}
private fun showConsultAssistantDialog() {
ModularServiceManager.provide(IConsultantService::class.java).showConsultAssistantDialog(activity)
}
private fun hideConsultAssistantDialog() {
ModularServiceManager.provide(IConsultantService::class.java).hideConsultAssistantDialog()
}
override fun onResume() {
super.onResume()
if (userVisibleHint) {
mPresenter?.loadHomeData()
mPresenter?.prepareCoupon(activity)
//走咨询助理浮层展示逻辑,是否展示由内部条件与接口判断
showConsultAssistantDialog()
}
}
}
\ No newline at end of file
package com.yidianling.home.ui.scrollView;
import android.content.Context;
import android.support.v4.widget.NestedScrollView;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
* 用于子类防止父类拦截子类的事件
*/
public class DisInterceptNestedScrollView extends NestedScrollView {
public DisInterceptNestedScrollView(Context context) {
super(context);
requestDisallowInterceptTouchEvent(true);
}
public DisInterceptNestedScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
requestDisallowInterceptTouchEvent(true);
}
public DisInterceptNestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
requestDisallowInterceptTouchEvent(true);
}
public boolean dispatchTouchEvent(MotionEvent ev) {
getParent().requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
requestDisallowInterceptTouchEvent(false);
break;
}
return super.onTouchEvent(event);
}
}
package com.yidianling.home.ui.view
import android.app.Activity
import android.app.Dialog
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.text.TextUtils
import com.yidianling.home.R
import com.yidianling.home.model.bean.CouponBean
import kotlinx.android.synthetic.xlzx.dialog_coupon.*
/**
* @author jiucheng
* @描述:首页优惠券弹窗
* @Copyright Copyright (c) 2018
* @Company 壹点灵
* @date 2018/8/6
*/
class CouponDialog : Dialog {
private var activity: Activity? = null
var status: Int = STATUS_RECEIVER
var couponBean: CouponBean? = null
var list: List<CouponBean>? = null
var listener: OnClickEnsureListener? = null
companion object {
var STATUS_RECEIVER = 0 //立即领取
var STATUS_GET = 1 //查看我的卡券
}
constructor(activity: Activity?, list: List<CouponBean>, listener: OnClickEnsureListener?) : super(activity) {
this.activity = activity
this.couponBean = list[0]
this.list = list
this.listener = listener
}
fun updateStatus(status: Int) {
this.status = status
updateUiByStatus()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.dialog_coupon)
setCanceledOnTouchOutside(false)
window.setBackgroundDrawable(ColorDrawable())
if (couponBean != null) {
if (!TextUtils.isEmpty(couponBean!!.title)) {
tv_title.text = couponBean!!.title
}
tv_duration.text = couponBean!!.validity
if (TextUtils.equals("1", couponBean!!.type)) {
tv_money.text = couponBean!!.amount
tv_unit.text = "元"
} else {
tv_money.text = (couponBean!!.discount?:"0".toFloat() * 10).toString()
tv_unit.text = "折"
}
tv_limit.text = couponBean!!.condition
}
updateUiByStatus()
tv_ensure.setOnClickListener {
if (listener != null) {
listener!!.clickEnsure(status)
}
if (status == STATUS_GET) {
dismiss()
}
}
iv_close.setOnClickListener {
dismiss()
}
}
private fun updateUiByStatus() {
var title = ""
var ensureText = ""
var iamge = 0
when (status) {
STATUS_RECEIVER -> {
if (list!!.size > 1) {
title = "获得${list!!.size}张新的优惠券"
} else {
title = "获得新优惠券"
}
ensureText = "立即领取"
iamge = R.drawable.coupon_receiver
}
STATUS_GET -> {
if (list!!.size > 1) {
title = "获得${list!!.size}张新的优惠券"
} else {
title = "恭喜您,领取成功"
}
ensureText = "查看我的卡券"
iamge = R.drawable.coupon_success
}
}
iv_title.setImageResource(iamge)
tv_status.text = title
tv_ensure.text = ensureText
}
interface OnClickEnsureListener {
fun clickEnsure(status: Int)
}
override fun show() {
if (null == activity || activity!!.isFinishing) {
return
}
super.show()
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.support.v7.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.ydl.ydl_image.manager.YDLImageCacheManager
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeArticleBean
import kotlinx.android.synthetic.xlzx.home_module_article_item_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 文章*阅读模块item
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/14
*/
class HomeArticleItemView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) :
LinearLayout(mContext) {
init {
initView()
}
private fun initView() {
val params = RecyclerView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams = params
View.inflate(mContext, R.layout.home_module_article_item_view, this)
}
fun updateData(bean: HomeArticleBean.Bean?) {
homeModuleArticleItemViewTitle.text = bean?.title
homeModuleArticleItemViewContent.text = bean?.desc
homeModuleArticleItemViewAuthor.text = bean?.name
homeModuleArticleItemViewGreatNum.text = bean?.countOfFavorite.toString()
homeModuleArticleItemViewLookNum.text = bean?.readNum.toString()
YDLImageCacheManager.showImage(mContext, bean?.imgUrl, homeModuleArticleItemViewImg)
setOnClickListener {
bean?.let {
homeEvent?.articleItemClick(bean)
}
}
}
/**
* 最后一个item需要隐藏item的下划线
*/
fun hideBottomLine() {
homeModuleArticleItemViewBottomLine.visibility = View.GONE
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.support.v7.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeArticleBean
import kotlinx.android.synthetic.xlzx.home_module_article_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 文章*阅读模块
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeArticleView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) :
LinearLayout(mContext) {
private var cacheList: ArrayList<HomeArticleBean.Bean> = ArrayList()
init {
initView()
}
private fun initView() {
orientation = VERTICAL
val params = RecyclerView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams = params
View.inflate(mContext, R.layout.home_module_article_view, this)
homeModuleArticleViewHomeCommonTitleView.setTitle("文章·阅读")
homeModuleArticleViewHomeCommonTitleView.setOnClickListener {
homeEvent?.articleMoreClick()
}
}
fun initData(list: List<HomeArticleBean.Bean>?) {
//添加View
if (list == null) {
return
}
if (cacheList.size != list?.size) {
cacheList.clear()
cacheList.addAll(list!!)
updateHomeArticleItemViewNumber()
}
//刷新数据
for (index in 0 until childCount) {
val itemView = getChildAt(index)
if (itemView is HomeArticleItemView) {
itemView.updateData(list[index - 1])
// 最后一个隐藏底部横线
if (index == childCount - 1) {
itemView.hideBottomLine()
}
}
}
}
/**
* 更新itemView的数量以适应新的数据集
*/
private fun updateHomeArticleItemViewNumber() {
var childCountRecord = childCount - 1 //减1是因为第一个子View是标题View
while (cacheList.size > childCountRecord) {
addView(HomeArticleItemView(mContext, homeEvent))
childCountRecord++
}
while (cacheList.size < childCountRecord && getChildAt(childCountRecord - 1) is HomeArticleItemView) {
removeViewAt(childCountRecord - 1)
childCountRecord--
}
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.support.v7.widget.CardView
import android.view.View
import android.widget.LinearLayout
import com.ydl.ydl_image.manager.YDLImageCacheManager
import com.yidianling.common.tools.RxDeviceTool
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import kotlinx.android.synthetic.xlzx.home_module_assuage_grief_image_more_five_item_view.view.*
import kotlinx.android.synthetic.xlzx.home_module_assuage_grief_image_under_four_item_view.view.*
import kotlinx.android.synthetic.xlzx.home_module_assuage_grief_image_under_two_item_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 解忧*问答模块内部图片模块
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/15
*/
class HomeAssuageGriefImageItemView(
private val mContext: Context,
private val urlList: List<String>,
private var homeEvent: IHomeBaseEvent?
) : CardView(mContext) {
init {
initView()
}
private fun initView() {
radius = 4f
cardElevation = 0f
var screenWidth = RxDeviceTool.getScreenWidth(mContext)
var viewWidth = (screenWidth - 2 * 30 * RxDeviceTool.getScreenDensity(mContext)).toInt()
var params: LinearLayout.LayoutParams?
//根据图片的数量,加载不同的图片布局
if (urlList.size <= 2) {
var viewHeight = viewWidth * 178 / 315
params = LinearLayout.LayoutParams(viewWidth, viewHeight)
params.bottomMargin = (20 * RxDeviceTool.getScreenDensity(mContext)).toInt()
layoutParams = params
View.inflate(
mContext,
R.layout.home_module_assuage_grief_image_under_two_item_view,
this
)
YDLImageCacheManager.showImage(
mContext,
urlList[0],
homeModuleAssuageGriefUnderTwoItemViewImg
)
} else if (urlList.size <= 4) {
var viewHeight = viewWidth * 178 / 315
params = LinearLayout.LayoutParams(viewWidth, viewHeight)
params.bottomMargin = (20 * RxDeviceTool.getScreenDensity(mContext)).toInt()
layoutParams = params
View.inflate(
mContext,
R.layout.home_module_assuage_grief_image_under_four_item_view,
this
)
YDLImageCacheManager.showImage(
mContext,
urlList[0],
homeModuleAssuageGriefUnderFourItemViewFirstImg
)
YDLImageCacheManager.showImage(
mContext,
urlList[1],
homeModuleAssuageGriefUnderFourItemViewSecondImg
)
YDLImageCacheManager.showImage(
mContext,
urlList[2],
homeModuleAssuageGriefUnderFourItemViewThirdImg
)
homeModuleAssuageGriefUnderFourthItemViewTag.text = urlList.size.toString() + "图"
} else if (urlList.size >= 5) {
var viewHeight = viewWidth * 180 / 315
params = LinearLayout.LayoutParams(viewWidth, viewHeight)
params.bottomMargin = (20 * RxDeviceTool.getScreenDensity(mContext)).toInt()
layoutParams = params
View.inflate(
mContext,
R.layout.home_module_assuage_grief_image_more_five_item_view,
this
)
YDLImageCacheManager.showImage(
mContext,
urlList[0],
homeModuleAssuageGriefUnderFiveItemViewFirstImg
)
YDLImageCacheManager.showImage(
mContext,
urlList[1],
homeModuleAssuageGriefUnderFiveItemViewSecondImg
)
YDLImageCacheManager.showImage(
mContext,
urlList[2],
homeModuleAssuageGriefUnderFiveItemViewThirdImg
)
YDLImageCacheManager.showImage(
mContext,
urlList[3],
homeModuleAssuageGriefUnderFiveItemViewFourthImg
)
YDLImageCacheManager.showImage(
mContext,
urlList[4],
homeModuleAssuageGriefUnderFiveItemViewFiveImg
)
homeModuleAssuageGriefUnderFiveItemViewTag.text = urlList.size.toString() + "图"
}
}
fun updateData() {
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.text.*
import android.text.style.ForegroundColorSpan
import android.text.style.ImageSpan
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import com.ydl.ydl_image.manager.YDLImageCacheManager
import com.ydl.ydl_router.manager.YDLRouterManager
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlcommon.router.IYDLRouterConstant
import com.ydl.ydlcommon.utils.MoonUtil
import com.ydl.ydlcommon.utils.Utils
import com.yidianling.common.tools.RxDeviceTool
import com.yidianling.common.tools.RxImageTool
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeAskBean
import com.yidianling.user.api.service.IUserService
import kotlinx.android.synthetic.xlzx.home_module_assuage_grief_item_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 解忧*问答模块item
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/15
*/
class HomeAssuageGriefItemView(
private val mContext: Context,
private var homeEvent: IHomeBaseEvent?
) : LinearLayout(mContext) {
private var homeAssuageGriefImageItemView: HomeAssuageGriefImageItemView? = null
private var focusClick: Boolean = false;
init {
initView()
}
private fun initView() {
val params = LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
params.setMargins(
(15 * RxDeviceTool.getScreenDensity(mContext)).toInt()
, (0 * RxDeviceTool.getScreenDensity(mContext)).toInt()
, (15 * RxDeviceTool.getScreenDensity(mContext)).toInt()
, (16 * RxDeviceTool.getScreenDensity(mContext)).toInt()
)
layoutParams = params
View.inflate(mContext, R.layout.home_module_assuage_grief_item_view, this)
}
fun updateData(bean: HomeAskBean.DataBean, position: Int, index: Int) {
this.setOnClickListener {
homeEvent?.askItemClick(bean)
}
YDLImageCacheManager.showImage(mContext, bean?.header, homeModuleAssuageGriefViewPersonImg)
homeModuleAssuageGriefViewPersonName.text = bean?.name
// homeModuleAssuageGriefViewTime.text = bean?.timeStr
MoonUtil.identifyFaceExpression(
mContext, homeModuleAssuageGriefViewContent,
bean?.content, ImageSpan.ALIGN_BOTTOM
)
homeModuleAssuageGriefViewTag.text = bean?.askTag
homeModuleAssuageGriefViewCommentsCount.text = bean?.commentsCount.toString()
homeModuleAssuageGriefViewZanCount.text = bean?.zanCount.toString()
/**
* 点赞
*/
ll_zan.setOnClickListener {
if (!Utils.isFastClick()) {
if (!ModularServiceManager.provide(IUserService::class.java).isLogin()) {
//跳转登录
YDLRouterManager.router(IYDLRouterConstant.ROUTER_MINE_LOGIN)
return@setOnClickListener
}
bean.isZan = if (bean.isZan == 1) 0 else 1
if (bean.isZan == 1) {
homeModuleAssuageGriefViewZanState.setImageResource(R.drawable.home_module_assuage_grief_item_view_tab_warm_has_zan)
} else {
homeModuleAssuageGriefViewZanState.setImageResource(R.drawable.home_module_assuage_grief_item_view_tab_warm)
}
bean.zanCount = if (bean.isZan == 1) bean.zanCount + 1 else bean.zanCount - 1
homeModuleAssuageGriefViewZanCount.text = bean?.zanCount.toString()
//防止连击
homeEvent?.askItemZanClick(position, index, bean.id.toString())
}
}
homeModuleAssuageGriefItemViewIsFollow.setOnClickListener {
if (bean.isFocused == 1) {
homeEvent?.askItemClick(bean)
} else {
if (!Utils.isFastClick()) {
if (!ModularServiceManager.provide(IUserService::class.java).isLogin()) {
//跳转登录
YDLRouterManager.router(IYDLRouterConstant.ROUTER_MINE_LOGIN)
return@setOnClickListener
}
bean.isFocused = if (bean.isFocused == 1) 0 else 1
setFollowType(bean.isFocused == 1)
//防止连击
homeEvent?.askItemFocusClick(position, bean.uid.toString())
}
}
}
if (bean.uid == 0) {
//匿名,隐藏关注按钮
homeModuleAssuageGriefItemViewIsFollow.visibility = View.GONE
} else {
/**
* 关注
*/
if (bean.isFocused == 1) {
setFollowType(true)
} else {
setFollowType(false)
}
}
/**
* 标题
*/
if (!TextUtils.isEmpty(bean?.title)) {
homeModuleAssuageGriefViewTitle.visibility = View.VISIBLE
homeModuleAssuageGriefViewTitle.text = bean?.title
}
/**
* 点赞
*/
if (bean?.isZan == 1) {
homeModuleAssuageGriefViewZanState.setImageResource(R.drawable.home_module_assuage_grief_item_view_tab_warm_has_zan)
} else {
homeModuleAssuageGriefViewZanState.setImageResource(R.drawable.home_module_assuage_grief_item_view_tab_warm)
}
/**
* 图片
*/
if (null != bean?.smallAttach && bean?.smallAttach!!.isNotEmpty()) {
if (homeAssuageGriefImageItemView != null) {
homeModuleAssuageGriefViewChildLayout.removeView(homeAssuageGriefImageItemView)
}
homeAssuageGriefImageItemView = HomeAssuageGriefImageItemView(
mContext,
bean?.smallAttach as List<String>,
homeEvent
)
homeModuleAssuageGriefViewChildLayout.addView(homeAssuageGriefImageItemView, 1)
} else {
if (null != homeAssuageGriefImageItemView) {
homeModuleAssuageGriefViewChildLayout.removeView(homeAssuageGriefImageItemView)
}
}
/**
* 评论
*/
initComment(bean)
}
private fun setFollowType(boolean: Boolean) {
if (boolean) {
homeModuleAssuageGriefItemViewFollow.visibility = View.VISIBLE
homeModuleAssuageGriefItemViewUnFollow.visibility = View.GONE
} else {
homeModuleAssuageGriefItemViewFollow.visibility = View.GONE
homeModuleAssuageGriefItemViewUnFollow.visibility = View.VISIBLE
}
}
private fun initComment(bean: HomeAskBean.DataBean) {
if (bean?.commentsCount > 0) {
homeModuleAssuageGriefViewComment.visibility = View.VISIBLE
var index: Int = 0
var commentBean = bean?.comments!![0]
if (null != commentBean.name && commentBean.name!!.isNotEmpty())
setPartTextColor(
homeModuleAssuageGriefViewHotViewComment, commentBean.name,
0, commentBean.name?.length!!, Color.parseColor("#1DA1F2")
)
// userType为2 ,专家
if (commentBean.userType == 2) {
setImage(
mContext, homeModuleAssuageGriefViewHotViewComment, "vip",
R.drawable.home_module_assuage_grief_item_user_type_v,
RxImageTool.dp2px(13f),
RxImageTool.dp2px(13f)
)
}
setAppendPartTextColor(
homeModuleAssuageGriefViewHotViewComment, ":",
0,
1
, Color.parseColor("#1DA1F2")
)
MoonUtil.identifyFaceExpression(
mContext, homeModuleAssuageGriefViewHotViewCommentContent,
commentBean.content, ImageSpan.ALIGN_BOTTOM
)
var emptyString = ""
if (null != commentBean.name && commentBean.name!!.isNotEmpty()) {
if (commentBean.userType == 2) {
emptyString += "缩"
}
for (index in 0 until commentBean.name!!.length) {
emptyString += commentBean.name!![index]
}
emptyString += "缩"
}
val span =
SpannableStringBuilder(emptyString + homeModuleAssuageGriefViewHotViewCommentContent.text)
span.setSpan(
ForegroundColorSpan(Color.TRANSPARENT), 0, emptyString.length,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
)
homeModuleAssuageGriefViewHotViewCommentContent.text = span
}
}
fun setPartTextColor(
textView: TextView, text: String?,
start: Int, end: Int, colorId: Int
) {
var ss: SpannableString = SpannableString(text)
ss.setSpan(
ForegroundColorSpan(colorId), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
textView.text = ss
}
fun setAppendPartTextColor(
textView: TextView, text: String?,
start: Int, end: Int, colorId: Int
) {
var ss: SpannableString = SpannableString(text)
ss.setSpan(
ForegroundColorSpan(colorId), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
textView.append(ss)
}
fun setImage(
context: Context,
textView: TextView,
bitmapText: String,
resId: Int,
width: Int,
height: Int
) {
var ss: SpannableString = SpannableString(bitmapText)
var drawable: Drawable = context.resources.getDrawable(resId)
drawable.setBounds(0, 0, width, height)
var imageSpan: ImageSpan = ImageSpan(drawable, ImageSpan.ALIGN_BASELINE)
ss.setSpan(
imageSpan, 0, bitmapText.length,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
textView.append(ss)
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeAskBean
import kotlinx.android.synthetic.xlzx.home_module_assuage_grief_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 解忧*问答模块
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeAssuageGriefView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) :
LinearLayout(mContext) {
private var cacheList: ArrayList<HomeAskBean.DataBean> = ArrayList()
init {
initView()
}
private fun initView() {
orientation = VERTICAL
val params = LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams = params
View.inflate(mContext, R.layout.home_module_assuage_grief_view, this)
homeModuleAssuageGriefViewHomeCommonTitleView.setTitle("解忧·问答")
homeModuleAssuageGriefViewHomeCommonTitleView.setOnClickListener {
homeEvent?.askMoreClick()
}
}
fun initData(position: Int, list: List<HomeAskBean.DataBean>?) {
//添加View
if (list == null) {
return
}
if (cacheList.size != list?.size) {
cacheList.clear()
cacheList.addAll(list!!)
updateHomeAssuageGriefItemViewNumber()
}
//刷新数据
for (index in 0..childCount) {
val itemView = getChildAt(index)
if (itemView is HomeAssuageGriefItemView) {
itemView.updateData(list[index - 1], position, index - 1)
}
}
}
/**
* 更新itemView的数量以适应新的数据集
*/
private fun updateHomeAssuageGriefItemViewNumber() {
var childCountRecord = childCount - 1 //减1是因为第一个子View是标题View
while (cacheList.size > childCountRecord) {
addView(HomeAssuageGriefItemView(mContext, homeEvent))
childCountRecord++
}
while (cacheList.size < childCountRecord && getChildAt(childCountRecord - 1) is HomeAssuageGriefItemView) {
removeViewAt(childCountRecord - 1)
childCountRecord--
}
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.support.v7.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.LinearLayout
import com.yidianling.common.tools.RxImageTool
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeHeaderBean
import kotlinx.android.synthetic.xlzx.home_module_button_banner_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 顶部预约专家,即时倾诉,心理课堂,心理测试按钮模块
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeButtonBannerView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) :
LinearLayout(mContext) {
/**
* 数据缓存
*/
var mDataList: ArrayList<HomeHeaderBean.AskCategoryDataBean>? = null
/**
* 间隔
*/
var margin: Int = 0
/**
* 是否添加了实时测试状态View
*/
var hasRealTestView: Boolean = false
private var realTestView: HomePagerBannerRealView? = null
/**
* 线
*/
private var lineView: View? = null
private var buttonParams: LinearLayout.LayoutParams? = null
init {
initView()
}
private fun initView() {
val params = RecyclerView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams = params
View.inflate(mContext, R.layout.home_module_button_banner_view, this)
// initButtonView()
homeModuleButtonBannerFirst.setOnClickListener {
homeEvent?.reservationExpertsClick()
}
homeModuleButtonBannerSecond.setOnClickListener {
homeEvent?.nowConfideClick()
}
homeModuleButtonBannerThird.setOnClickListener {
homeEvent?.psychologyClassClick()
}
homeModuleButtonBannerFourth.setOnClickListener {
homeEvent?.psychologyTestClick()
}
}
fun initData(
homeSaleData: List<HomeHeaderBean.HomeSaleDataBean>?,
homeCategory: List<HomeHeaderBean.AskCategoryDataBean>?
) {
setRealTextView(homeSaleData)
homeEvent?.let { home_category_view.setEvent(it) };
home_category_view.initData(homeCategory)
}
/**
* 初始化实时测评状态View
*/
private fun initRealTextView() {
if (null == realTestView) {
var realTestParam = FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
realTestView = HomePagerBannerRealView(context, homeEvent!!)
realTestView!!.layoutParams = realTestParam
}
}
private fun initLineView() {
var lineParam =
FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, RxImageTool.dip2px(0.5f))
var dp15 = RxImageTool.dip2px(15f)
lineParam.leftMargin = dp15
lineParam.rightMargin = dp15
lineView = View(context)
lineView!!.setBackgroundColor(resources.getColor(R.color.home_module_category_view_test_line))
lineView!!.layoutParams = lineParam
}
/**
* 实时测评状态赋值
*/
private fun setRealTextView(list: List<HomeHeaderBean.HomeSaleDataBean>?) {
if (!hasRealTestView) {
initLineView()
ll_home_module_button.addView(lineView)
initRealTextView()
ll_home_module_button.addView(realTestView)
val cutOffParams = FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
RxImageTool.dip2px(0.5f)
)
cutOffParams.height = RxImageTool.dip2px(10f)
val cutOffView = View(context)
cutOffView.setBackgroundColor(resources.getColor(R.color.colorBg))
cutOffView.layoutParams = cutOffParams
ll_home_module_button.addView(cutOffView)
hasRealTestView = true
}
realTestView!!.initData(list)
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.support.constraint.ConstraintLayout
import android.util.AttributeSet
import android.view.View
import com.yidianling.home.R
import kotlinx.android.synthetic.xlzx.home_module_common_title_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 首页通用标题
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/14
*/
class HomeCommonTitleView(private val mContext: Context, private val attributeSet: AttributeSet) : ConstraintLayout(mContext, attributeSet) {
init {
initView()
}
private fun initView() {
View.inflate(mContext, R.layout.home_module_common_title_view, this)
}
fun setTitle(title: String) {
homeModuleCommonTitleViewTitle.text = title
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Paint
import android.text.TextUtils
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import com.ydl.ydl_image.config.SimpleImageOpConfiger
import com.ydl.ydl_image.manager.YDLImageCacheManager
import com.yidianling.common.tools.RxImageTool
import com.yidianling.home.R
import com.yidianling.home.event.HomeImpl
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.model.bean.HomeConfideBean
import kotlinx.android.synthetic.xlzx.home_module_confide_expert_info_view.view.*
/**
* @author jiucheng
* @描述:首页倾诉模块--专家个人信息view
* @Copyright Copyright (c) 2018
* @Company 壹点灵
* @date 2019/2/16
*/
class HomeConfideExpertInfoView(
private var mContext: Context,
private var homeEvent: HomeImpl?
) : FrameLayout(mContext) {
private var dp70 = 0
init {
initView()
dp70 = RxImageTool.dip2px(70f)
}
private fun initView() {
var params = FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams = params
View.inflate(context, R.layout.home_module_confide_expert_info_view, this)
}
fun setData(bean: HomeConfideBean.BodyBean?, position: Int, isLast: Boolean) {
if (bean == null) {
visibility = View.GONE
return
}
//设置头像
setHead(bean)
//设置名称
tv_name.text = bean.confidedName
//设置倾诉标签View的最大宽度
tag_view.setConfideWidth()
//咨询师标签
tag_view.initData(bean.confidedTag as MutableList<String>)
//设置向TA倾诉人数
setConfideNum(bean)
//设置接通率文案
setConnection(bean)
//设置向TA倾诉按钮状态
setConfideButton(bean)
//设置红包、原价
setCoupon(bean)
//最后一项显示分割线
if (isLast) {
view_line.visibility = View.GONE
} else {
view_line.visibility = View.VISIBLE
}
this.setOnClickListener {
homeEvent!!.confideClick(bean.linkUrl, bean.doctorId)
}
iv_confide_voice.setOnClickListener {
homeEvent!!.confidePlayClick(iv_confide_voice, bean)
}
}
/**
* 设置头像
*/
private fun setHead(bean: HomeConfideBean.BodyBean) {
val op = SimpleImageOpConfiger()
op.errorPic = R.drawable.platform_head_place_hold_pic
op.loadingPic = R.drawable.platform_head_place_hold_pic
op.transform = 0
YDLImageCacheManager.showImage(mContext, bean.confidedIcon, img_head, op)
}
/**
* 设置向TA倾诉人数
*/
private fun setConfideNum(bodyBean: HomeConfideBean.BodyBean) {
if (TextUtils.isEmpty(bodyBean.confideNum)) {
tv_confideNum.visibility = View.GONE
tv_tv_confideNumContent.visibility = View.GONE
} else {
tv_confideNum.visibility = View.VISIBLE
tv_tv_confideNumContent.visibility = View.VISIBLE
if (bodyBean.confideNum?.indexOf("人") != -1) {
bodyBean.confideNum =
bodyBean.confideNum?.substring(0, bodyBean.confideNum?.length!! - 1)
}
tv_confideNum.text = bodyBean.confideNum
}
}
/**
* 设置接通率文案
*/
private fun setConnection(bodyBean: HomeConfideBean.BodyBean) {
if (TextUtils.isEmpty(bodyBean.confideConnection)) {
tv_Connection.visibility = View.INVISIBLE
tv_ConnectionContent.visibility = View.INVISIBLE
} else {
tv_Connection.visibility = View.VISIBLE
tv_ConnectionContent.visibility = View.VISIBLE
tv_Connection.text = bodyBean.confideConnection
}
}
/**
* 设置向TA倾诉按钮状态
*/
private fun setConfideButton(bodyBean: HomeConfideBean.BodyBean) {
when (bodyBean.confideLine) {//1在线 2离线 3通话中 4继续倾诉
1 -> {
tv_confide.setBackgroundResource(R.drawable.home_module_confide_line_1)
}
2 -> {
tv_confide.setBackgroundResource(R.drawable.home_module_confide_line_2)
}
3 -> {
tv_confide.setBackgroundResource(R.drawable.home_module_confide_line_3)
}
4 -> {
tv_confide.setBackgroundResource(R.drawable.home_module_confide_line_4)
}
}
tv_confide.setOnClickListener {
if (bodyBean.confideLine == 2) {//喊他上线 私聊
homeEvent!!.toChatForMsg(bodyBean.uid.toString())
} else {
homeEvent!!.confideClick(bodyBean.linkUrl,bodyBean.doctorId)
}
}
}
/**
* 设置红包、原价
*/
@SuppressLint("SetTextI18n")
private fun setCoupon(bodyBean: HomeConfideBean.BodyBean) {
if (bodyBean.couponMoney.toFloat().toInt() <= 0) {//优惠金额
tvCoupon.visibility = View.GONE
tvOriginalPrice.visibility = View.GONE
tv_price.text = "¥${bodyBean.confideFee}"
} else {
val couponMoney = bodyBean.couponMoney.toFloat().toInt()
val confideFee = bodyBean.confideFee.toFloat().toInt()
val sb = StringBuilder()
sb.append("立减").append(couponMoney).append("元")
tvCoupon.text = sb.toString()
tvCoupon.visibility = View.VISIBLE
tvOriginalPrice.visibility = View.VISIBLE
val originalBuffer = StringBuilder()
originalBuffer.append("原价¥").append(bodyBean.confideFee)
tvOriginalPrice.text = originalBuffer.toString()
//添加删除线
tvOriginalPrice.paint.flags = Paint.STRIKE_THRU_TEXT_FLAG
if (couponMoney >= confideFee) {
tv_price.text = "¥0"
} else {
val price = confideFee - couponMoney
tv_price.text = "¥$price"
}
}
}
}
package com.yidianling.home.ui.view
import android.content.Context
import android.graphics.Typeface
import android.os.Build
import android.support.design.widget.TabLayout
import android.support.v4.content.ContextCompat
import android.support.v7.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import com.yidianling.common.tools.LogUtil
import com.yidianling.home.R
import com.yidianling.home.event.HomeImpl
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeConfideBean
import com.yidianling.home.model.bean.HomeHeaderBean
import kotlinx.android.synthetic.xlzx.home_module_confide_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 倾诉*排解模块
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeConfideView(private val mContext: Context, private var homeEvent: HomeImpl?) :
LinearLayout(mContext) {
private var mLastPosition: Int = 0
/**
* 专家信息view缓存list
*/
private var cacheInfoViewList: ArrayList<HomeConfideExpertInfoView>? = null
/**
* TabLayout.OnTabSelectedListener
*/
private var listener: ConfideExpertTabSelectedListener? = null
init {
initView()
}
private fun initView() {
val params = RecyclerView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams = params
orientation = VERTICAL
View.inflate(mContext, R.layout.home_module_confide_view, this)
homeModuleConfideViewHomeCommonTitleView.setTitle("倾诉·排解")
homeModuleConfideViewHomeCommonTitleView.setOnClickListener {
homeEvent?.confideMoreClick()
}
}
/**
* 创建tab栏
* @param lastPosition 上次选中的下标
*/
fun setTitle(list: List<HomeHeaderBean.ListenCategoryDateBean>?, lastPosition: Int) {
if (list == null || list.isEmpty()) {
visibility = View.GONE
return
}
if (listener != null) {
tab_layout.removeOnTabSelectedListener(listener!!)
}
mLastPosition = lastPosition
tab_layout.removeAllTabs()
for ((index, bean) in list.withIndex()) {
tab_layout.addTab(tab_layout.newTab().setText(bean.name), index == lastPosition)
}
listener = ConfideExpertTabSelectedListener(list, tab_layout)
tab_layout.addOnTabSelectedListener(listener!!)
var textView =
((tab_layout!!.getChildAt(0) as LinearLayout).getChildAt(lastPosition) as LinearLayout).getChildAt(
1
)
if (textView != null && textView is TextView) {
textView.textSize = 21f
textView.setTextColor(ContextCompat.getColor(mContext, R.color.platform_color_242424))
textView.typeface = Typeface.defaultFromStyle(Typeface.BOLD)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
tab_layout.setOnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY ->
LogUtil.e("scrollX=$scrollX")
LogUtil.e("oldScrollX=$oldScrollX")
}
}
}
/**
* 设置数据
*/
fun setConfideExpertInfoView(list: List<HomeConfideBean.BodyBean>?) {
if (list == null || list.isEmpty()) {
ll_content.visibility = View.GONE
return
}
ll_content.visibility = View.VISIBLE
ll_content.removeAllViews()
if (cacheInfoViewList == null) {
cacheInfoViewList = ArrayList()
}
//创建HomeConfideExpertInfoView:每个tab最多显示三个专家
if (cacheInfoViewList!!.size >= list.size) {
for (index in 0 until list!!.size) {
//设置数据
cacheInfoViewList!![index].setData(list[index]!!, index, index == list!!.size - 1)
//添加到布局
ll_content.addView(cacheInfoViewList!![index])
}
} else {
for (index in 0 until list!!.size) {
if (index > 2) {
//只取前三条数据
break
}
//数据大于缓存view数量,创建view
if (index > cacheInfoViewList!!.size - 1) {
var homeConfideExpertInfoView = createExpertInfoView()
cacheInfoViewList!!.add(homeConfideExpertInfoView)
}
//设置数据
cacheInfoViewList!![index].setData(list[index]!!, index, index == list!!.size - 1)
//添加到布局
ll_content.addView(cacheInfoViewList!![index])
}
}
}
/**
* 创建专家信息view
*/
private fun createExpertInfoView(): HomeConfideExpertInfoView {
return HomeConfideExpertInfoView(mContext, homeEvent)
}
inner class ConfideExpertTabSelectedListener : TabLayout.OnTabSelectedListener {
private var list: List<HomeHeaderBean.ListenCategoryDateBean>? = null
private var tabLayout: TabLayout? = null
constructor(list: List<HomeHeaderBean.ListenCategoryDateBean>, tabLayout: TabLayout) {
this.list = list
this.tabLayout = tabLayout
}
override fun onTabReselected(tab: TabLayout.Tab?) {
}
override fun onTabUnselected(tab: TabLayout.Tab?) {
var textView =
((tabLayout!!.getChildAt(0) as LinearLayout).getChildAt(tab!!.position) as LinearLayout).getChildAt(
1
)
if (textView != null && textView is TextView) {
textView.textSize = 14f
textView.setTextColor(
ContextCompat.getColor(
mContext,
R.color.platform_color_333333
)
)
}
}
override fun onTabSelected(tab: TabLayout.Tab?) {
if (mLastPosition == tab!!.position) {
return
}
var textView =
((tabLayout!!.getChildAt(0) as LinearLayout).getChildAt(tab!!.position) as LinearLayout).getChildAt(
1
)
if (textView != null && textView is TextView) {
textView.textSize = 21f
textView.setTextColor(
ContextCompat.getColor(
mContext,
R.color.platform_color_242424
)
)
textView.typeface = Typeface.defaultFromStyle(Typeface.BOLD)
}
homeEvent!!.getConfideData(list!![tab!!.position], tab!!.position)
}
}
}
package com.yidianling.home.ui.view
import android.content.Context
import android.support.v4.content.ContextCompat
import android.text.TextUtils
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import com.ydl.ydl_image.manager.YDLImageCacheManager
import com.ydl.ydlcommon.utils.StringUtils
import com.ydl.ydlcommon.utils.URLUtils
import com.yidianling.common.tools.RxImageTool
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeConsultBean
import kotlinx.android.synthetic.xlzx.home_module_consult_item_view.view.*
/**
* @author jiucheng
* @描述:首页咨询理解模块--专家个人信息view
* @Copyright Copyright (c) 2018
* @Company 壹点灵
* @date 2019/2/16
*/
class HomeConsultItemView(private var mContext: Context, private var homeEvent: IHomeBaseEvent?) :
FrameLayout(mContext) {
private var dp70 = 0
init {
initView()
dp70 = RxImageTool.dip2px(70f)
}
private fun initView() {
var params = FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams = params
View.inflate(context, R.layout.home_module_consult_item_view, this)
}
fun setData(bean: HomeConsultBean.ListBean?, position: Int, isLast: Boolean, cateId: String?) {
if (bean == null) {
visibility = View.GONE
return
}
//设置头像
setHead(bean)
//设置名称
tv_consult_name.text = bean.doctorName
//咨询师标签
tag_view.initData(StringUtils.strToList(bean.tags))
//设置向TA倾诉人数
setConfideNum(bean)
//设置接通率文案
setConnection(bean)
//设置向TA倾诉按钮状态
setConfideButton(bean)
//设置红包、原价
setPrice(bean)
this.setOnClickListener {
val url = URLUtils.appendParmas(bean.hUrl, "cateId", cateId)
homeEvent!!.consultItemClick(url, bean.doctorId)
}
}
/**
* 设置头像
*/
private fun setHead(bean: HomeConsultBean.ListBean) {
YDLImageCacheManager.showImage(mContext, bean?.doctorHead, img_consult_head)
}
/**
* 设置向TA倾诉人数
*/
private fun setConfideNum(bodyBean: HomeConsultBean.ListBean) {
if (TextUtils.isEmpty(bodyBean.zixunOrderNum.toString())) {
tv_consult_num.visibility = View.GONE
tv_tv_consult_num_content.visibility = View.GONE
} else {
tv_consult_num.visibility = View.VISIBLE
tv_tv_consult_num_content.visibility = View.VISIBLE
tv_consult_num.text = bodyBean.zixunOrderNum.toString()
}
}
/**
* 设置接通率文案
*/
private fun setConnection(bodyBean: HomeConsultBean.ListBean) {
if (TextUtils.isEmpty(bodyBean.feedbackRate.toString())) {
tv_feedback_rate.visibility = View.INVISIBLE
tv_feedback_rate_content.visibility = View.INVISIBLE
} else {
tv_feedback_rate.visibility = View.VISIBLE
tv_feedback_rate_content.visibility = View.VISIBLE
try {
val dd = bodyBean.feedbackRate / 5.00f
val str = String.format("%.2f", dd * 100f) + "%"
tv_feedback_rate.text = str
} catch (e: Exception) {
e.printStackTrace()
}
}
}
/**
* 设置向TA倾诉按钮状态
*/
private fun setConfideButton(bodyBean: HomeConsultBean.ListBean) {
//私聊文案
if (TextUtils.isEmpty(bodyBean.chatBtnText)) {
tv_consult_chat.text = "私聊"
tv_consult_chat.setTextColor(
ContextCompat.getColor(
context,
R.color.platform_color_222222
)
)
tv_consult_chat.background =
ContextCompat.getDrawable(context, R.drawable.home_module_consult_chat_bg)
} else {
tv_consult_chat.text = bodyBean.chatBtnText
tv_consult_chat.setTextColor(
ContextCompat.getColor(
context,
R.color.platform_color_999999
)
)
tv_consult_chat.background =
ContextCompat.getDrawable(context, R.drawable.home_module_consult_chat_rest_bg)
}
tv_consult_chat.setOnClickListener {
homeEvent!!.consultChatClick(bodyBean.doctorUid.toString())
}
}
private fun setPrice(bodyBean: HomeConsultBean.ListBean) {
val confideFee = bodyBean.serviceFee
tv_consult_price.text = "¥$confideFee"
}
}
package com.yidianling.home.ui.view
import android.content.Context
import android.graphics.Typeface
import android.os.Build
import android.support.design.widget.TabLayout
import android.support.v4.content.ContextCompat
import android.support.v7.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import com.yidianling.common.tools.LogUtil
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeConsultBean
import com.yidianling.home.model.bean.HomeHeaderBean
import kotlinx.android.synthetic.xlzx.home_module_confide_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 咨询理解模块
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeConsultView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) :
LinearLayout(mContext) {
private var mLastPosition: Int = 0
/**
* 专家信息view缓存list
*/
private var cacheInfoViewList: ArrayList<HomeConsultItemView>? = null
/**
* TabLayout.OnTabSelectedListener
*/
private var listener: ConsultTabSelectedListener? = null
init {
initView()
}
private fun initView() {
val params = RecyclerView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams = params
orientation = VERTICAL
View.inflate(mContext, R.layout.home_module_confide_view, this)
homeModuleConfideViewHomeCommonTitleView.setTitle("咨询·理解")
homeModuleConfideViewHomeCommonTitleView.setOnClickListener {
homeEvent?.consultMoreClick()
}
}
/**
* 创建tab栏
* @param lastPosition 上次选中的下标
*/
fun setTitle(list: List<HomeHeaderBean.ConsultCategoryDateBean>?, lastPosition: Int) {
if (list == null || list.isEmpty()) {
visibility = View.GONE
return
}
if (listener != null) {
tab_layout.removeOnTabSelectedListener(listener!!)
}
mLastPosition = lastPosition
tab_layout.removeAllTabs()
for ((index, bean) in list.withIndex()) {
tab_layout.addTab(tab_layout.newTab().setText(bean.name), index == lastPosition)
}
listener = ConsultTabSelectedListener(list, tab_layout)
tab_layout.addOnTabSelectedListener(listener!!)
var textView =
((tab_layout!!.getChildAt(0) as LinearLayout).getChildAt(lastPosition) as LinearLayout).getChildAt(
1
)
if (textView != null && textView is TextView) {
textView.textSize = 26f
textView.setTextColor(ContextCompat.getColor(mContext, R.color.platform_color_242424))
textView.typeface = Typeface.defaultFromStyle(Typeface.BOLD)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
tab_layout.setOnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY ->
LogUtil.e("scrollX=$scrollX")
LogUtil.e("oldScrollX=$oldScrollX")
}
}
}
/**
* 设置数据
*/
fun setConsultInfoView(
list: List<HomeConsultBean.ListBean>?,
category: HomeHeaderBean.ConsultCategoryDateBean?
) {
if (list == null || list.isEmpty()) {
ll_content.visibility = View.GONE
return
}
ll_content.visibility = View.VISIBLE
ll_content.removeAllViews()
if (cacheInfoViewList == null) {
cacheInfoViewList = ArrayList()
}
//创建HomeConsultItemView:每个tab最多显示三个专家
if (cacheInfoViewList!!.size >= list.size) {
for (index in 0 until list!!.size) {
//设置数据
cacheInfoViewList!![index].setData(
list[index]!!,
index,
index == list!!.size - 1,
"${category?.id}"
)
//添加到布局
ll_content.addView(cacheInfoViewList!![index])
}
} else {
for (index in 0 until list!!.size) {
if (index > 2) {
//只取前三条数据
break
}
//数据大于缓存view数量,创建view
if (index > cacheInfoViewList!!.size - 1) {
var HomeConsultItemView = createConsultInfoView()
cacheInfoViewList!!.add(HomeConsultItemView)
}
//设置数据
cacheInfoViewList!![index].setData(
list[index]!!,
index,
index == list!!.size - 1,
"${category?.id}"
)
//添加到布局
ll_content.addView(cacheInfoViewList!![index])
}
}
}
/**
* 创建专家信息view
*/
private fun createConsultInfoView(): HomeConsultItemView {
return HomeConsultItemView(mContext, homeEvent)
}
inner class ConsultTabSelectedListener : TabLayout.OnTabSelectedListener {
private var list: List<HomeHeaderBean.ConsultCategoryDateBean>? = null
private var tabLayout: TabLayout? = null
constructor(list: List<HomeHeaderBean.ConsultCategoryDateBean>, tabLayout: TabLayout) {
this.list = list
this.tabLayout = tabLayout
}
override fun onTabReselected(tab: TabLayout.Tab?) {
}
override fun onTabUnselected(tab: TabLayout.Tab?) {
var textView =
((tabLayout!!.getChildAt(0) as LinearLayout).getChildAt(tab!!.position) as LinearLayout).getChildAt(
1
)
if (textView != null && textView is TextView) {
textView.textSize = 14f
textView.setTextColor(
ContextCompat.getColor(
mContext,
R.color.platform_color_333333
)
)
}
}
override fun onTabSelected(tab: TabLayout.Tab?) {
if (mLastPosition == tab!!.position) {
return
}
var textView =
((tabLayout!!.getChildAt(0) as LinearLayout).getChildAt(tab!!.position) as LinearLayout).getChildAt(
1
)
if (textView != null && textView is TextView) {
textView.textSize = 26f
textView.setTextColor(
ContextCompat.getColor(
mContext,
R.color.platform_color_242424
)
)
textView.typeface = Typeface.defaultFromStyle(Typeface.BOLD)
}
homeEvent!!.getConsultData(list!![tab!!.position], tab!!.position)
}
}
}
package com.yidianling.home.ui.view
import android.content.Context
import android.view.View
import android.view.ViewGroup
import android.widget.RelativeLayout
import com.ydl.ydl_image.manager.YDLImageCacheManager
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeCourseBean
import kotlinx.android.synthetic.xlzx.home_module_course_item_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 课程成长模块item
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/14
*/
class HomeCourseItemView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) :
RelativeLayout(mContext) {
init {
initView()
}
private fun initView() {
val params = RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams = params
View.inflate(mContext, R.layout.home_module_course_item_view, this)
}
/**
* 刷新数据
*/
fun updateData(bean: HomeCourseBean.ListBean?) {
YDLImageCacheManager.showImage(mContext, bean?.pic, homeModuleCourseItemViewImg)
homeModuleCourseItemViewTitle.text = bean?.title
homeModuleCourseItemViewPersonNum.text = bean?.readNums.toString()
if (bean?.applyFee == 0f) {
homeModuleCourseItemViewFreePrice.visibility = View.VISIBLE
homeModuleCourseItemViewExpensePriceHideView.visibility = View.GONE
} else {
if (bean?.isPromotion == 1) {
homeModuleCourseItemViewExpensePrice.text =
"¥" + String.format("%.2f", bean?.promotionApplyFee!!)
} else {
homeModuleCourseItemViewExpensePrice.text =
"¥" + String.format("%.2f", bean?.applyFee!!)
}
}
setOnClickListener {
homeEvent?.courseItemClick(bean)
}
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeCourseBean
import kotlinx.android.synthetic.xlzx.home_module_course_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 课程*成长模块
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeCourseView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) :
LinearLayout(mContext) {
private var cacheList: ArrayList<HomeCourseBean.ListBean> = ArrayList()
init {
initView()
}
private fun initView() {
orientation = VERTICAL
val params = LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams = params
View.inflate(mContext, R.layout.home_module_course_view, this)
homeModuleCourseViewHomeCommonTitleView.setTitle("课程·成长")
homeModuleCourseViewHomeCommonTitleView.setOnClickListener {
homeEvent?.courseMreClick()
}
}
fun initData(list: List<HomeCourseBean.ListBean>?) {
//添加View
if (list == null) {
return
}
if (cacheList.size != list?.size) {
cacheList.clear()
cacheList.addAll(list!!)
updateHomeCourseItemViewNumber()
}
//刷新数据
for (index in 0 until childCount) {
val itemView = getChildAt(index)
if (itemView is HomeCourseItemView) {
itemView.updateData(list[index - 1])
}
}
}
/**
* 更新itemView的数量以适应新的数据集
*/
private fun updateHomeCourseItemViewNumber() {
var childCountRecord = childCount - 1 //减1是因为第一个子View是标题View
while (cacheList.size > childCountRecord) {
addView(HomeCourseItemView(mContext, homeEvent))
childCountRecord++
}
while (cacheList.size < childCountRecord && getChildAt(childCountRecord - 1) is HomeCourseItemView) {
removeViewAt(childCountRecord - 1)
childCountRecord--
}
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.yidianling.common.tools.RxImageTool
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeFMBean
import kotlinx.android.synthetic.xlzx.home_module_intelligent_item_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 心灵电台模块item
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/14
*/
class HomeIntelligentItemView(
private val mContext: Context,
private var homeEvent: IHomeBaseEvent?
) : LinearLayout(mContext) {
private var params: LinearLayout.LayoutParams? = null
init {
initView()
}
private fun initView() {
orientation = VERTICAL
params = LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams = params
View.inflate(mContext, R.layout.home_module_intelligent_item_view, this)
}
/**
* 刷新数据
*/
fun updateData(bean: HomeFMBean.ListBean) {
homeModuleIntelligentItemViewTitle.text = bean.name
homeModuleIntelligentItemViewHits.text = bean.hits.toString()
this.setOnClickListener { homeEvent?.fmItemClick(bean) }
iv_fm_play.setOnClickListener { homeEvent?.fmPlayClick(bean) }
}
/**
* 电台第二个item会有一个marginTop值
*/
fun setTopMargin() {
params?.topMargin = RxImageTool.dp2px(16f)
layoutParams = params
}
/**
* 电台最后一个item会有一个marginBottom值
*/
fun setBottomMargin() {
params?.bottomMargin = RxImageTool.dp2px(16f)
layoutParams = params
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.view.View
import android.widget.LinearLayout
import com.ydl.ydl_image.manager.YDLImageCacheManager
import com.yidianling.common.tools.RxDeviceTool
import com.yidianling.common.tools.RxImageTool
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeFMBean
import kotlinx.android.synthetic.xlzx.home_module_intelligent_top_item_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 心灵电台模块item--顶部item
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/15
*/
class HomeIntelligentTopItemView(
private val mContext: Context,
private var homeEvent: IHomeBaseEvent?
) : LinearLayout(mContext) {
init {
initView()
}
private fun initView() {
orientation = VERTICAL
var screenWidth = RxDeviceTool.getScreenWidth(mContext)
var viewWidth = (screenWidth - 2 * 15 * RxDeviceTool.getScreenDensity(mContext)).toInt()
var viewHeight = viewWidth * 143 / 345
val params = LinearLayout.LayoutParams(viewWidth, viewHeight)
layoutParams = params
View.inflate(mContext, R.layout.home_module_intelligent_top_item_view, this)
}
/**
* 刷新数据
*/
fun updateData(bean: HomeFMBean.ListBean) {
var screenWidth = RxDeviceTool.getScreenWidth(mContext)
var viewWidth = (screenWidth - RxImageTool.dip2px(30f))
var viewHeight = viewWidth * 143 / 345
YDLImageCacheManager.showImage(
mContext,
bean?.imageUrl,
homeModuleIntelligentTopViewImage,
viewWidth,
viewHeight
)
homeModuleIntelligentTopViewTitle.text = bean.name
homeModuleIntelligentTopViewAuthor.text = bean.author
homeModuleIntelligentTopViewHits.text = bean.hits.toString()
this.setOnClickListener { homeEvent?.fmItemClick(bean) }
iv_play_fm.setOnClickListener { homeEvent?.fmPlayClick(bean) }
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeFMBean
import kotlinx.android.synthetic.xlzx.home_module_intelligent_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 心灵*电台模块
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeIntelligentView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) :
LinearLayout(mContext) {
private var cacheList: ArrayList<HomeFMBean.ListBean> = ArrayList()
init {
initView()
}
private fun initView() {
orientation = VERTICAL
val params = LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams = params
View.inflate(mContext, R.layout.home_module_intelligent_view, this)
homeModuleIntelligentViewHomeCommonTitleView.setTitle("心灵·电台")
homeModuleIntelligentViewHomeCommonTitleView.setOnClickListener {
homeEvent?.fmMoreClick()
}
}
fun initData(list: List<HomeFMBean.ListBean>?) {
//添加View
if (list == null) {
return
}
if (cacheList.size != list?.size) {
cacheList.clear()
cacheList.addAll(list)
updateHomeIntelligentItemViewNumber()
}
//刷新数据
for (index in 0 until homeModuleIntelligentViewAddLayout.childCount) {
val itemView = homeModuleIntelligentViewAddLayout.getChildAt(index)
if (itemView is HomeIntelligentItemView) {
//第一个这种类型item,需要设置marginTop = 16dp,最后一个item需要设置marginBototm = 16dp
if (index == 1) {
itemView.setTopMargin()
} else if (index == homeModuleIntelligentViewAddLayout.childCount - 1) {
itemView.setBottomMargin()
}
itemView.updateData(list[index])
} else if (itemView is HomeIntelligentTopItemView) {
itemView.updateData(list[index])
}
}
}
/**
* 更新itemView的数量以适应新的数据集
*/
private fun updateHomeIntelligentItemViewNumber() {
var childCountRecord = homeModuleIntelligentViewAddLayout.childCount
while (cacheList.size > childCountRecord) {
if (childCountRecord == 0) {
homeModuleIntelligentViewAddLayout.addView(
HomeIntelligentTopItemView(
mContext,
homeEvent
)
)
} else {
homeModuleIntelligentViewAddLayout.addView(
HomeIntelligentItemView(
mContext,
homeEvent
)
)
}
childCountRecord++
}
while (cacheList.size < childCountRecord &&
(homeModuleIntelligentViewAddLayout.getChildAt(childCountRecord - 1) is HomeIntelligentItemView
|| homeModuleIntelligentViewAddLayout.getChildAt(childCountRecord - 1) is HomeIntelligentTopItemView)
) {
homeModuleIntelligentViewAddLayout.removeViewAt(childCountRecord - 1)
childCountRecord--
}
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.graphics.Color
import android.util.TypedValue
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.TextView
import com.ydl.ydl_image.module.GlideApp
import com.ydl.ydlcommon.utils.ScreenUtil
import com.yidianling.common.tools.RxImageTool
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.model.bean.HomeHeaderBean
import kotlinx.android.synthetic.xlzx.home_module_pager_banner_category_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 首页顶部模块-分类模块
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/16
*/
class HomePagerBannerCategoryView(mContext: Context, homeEvent: IHomeBaseEvent) :
FrameLayout(mContext) {
/**
* 数据缓存
*/
var mDataList: ArrayList<HomeHeaderBean.AskCategoryDataBean>? = null
/**
* 分类view宽度
*/
var categoryWidth: Int = 0
/**
* 图片宽高
*/
var imageViewWidth: Int = 0
/**
* 文本宽度
*/
var textViewWidth: Int = 0
/**
* 文本高度
*/
var textViewHeight: Int = 0
/**
* 间隔
*/
var margin: Int = 0
var dp8: Int = 0
/**
* 是否添加了实时测试状态View
*/
var hasRealTestView: Boolean = false
private var realTestView: HomePagerBannerRealView? = null
/**
* 线
*/
private var lineView: View? = null
/**
* 图片View缓存
*/
private var imageViewCache: List<ImageView>? = null
/**
* 文本View缓存
*/
private var textViewCache: List<TextView>? = null
/**
* 倍数
*/
private var multiple: Int = 0
/**
* 测评首页事件处理类
*/
private var homeEvent: IHomeBaseEvent? = null
init {
initView()
this.homeEvent = homeEvent
}
/**
* 界面初始化
*/
private fun initView() {
View.inflate(context, R.layout.home_module_pager_banner_category_view, this)
val params = FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.WRAP_CONTENT
)
// params.topMargin = ScreenUtil.screenHeight * (356f / 750f).toInt()
layoutParams = params
initArgs()
}
/**
* 初始化变量
*/
private fun initArgs() {
categoryWidth = ScreenUtil.screenWidth - RxImageTool.dp2px(30f)
textViewWidth = categoryWidth / 4
imageViewWidth = RxImageTool.dip2px(38f)
margin = (categoryWidth - 4 * imageViewWidth) / 8
dp8 = RxImageTool.dip2px(8f)
//高度=文字12dp+16dp间距
textViewHeight = RxImageTool.dip2px(28f)
}
fun initData(
askCategoryDataBean: List<HomeHeaderBean.AskCategoryDataBean>?,
homeSaleData: List<HomeHeaderBean.HomeSaleDataBean>?
) {
if (null == askCategoryDataBean || askCategoryDataBean.isEmpty()) {
visibility = View.GONE
return
}
visibility = View.VISIBLE
if (null == mDataList) {
mDataList = ArrayList()
}
if (getChange(askCategoryDataBean, mDataList)) {
mDataList!!.clear()
mDataList!!.addAll(askCategoryDataBean)
}
refreshView()
setRealTextView(homeSaleData)
}
/**
* 判断数据是否变化
*/
private fun getChange(
bean: List<HomeHeaderBean.AskCategoryDataBean>?,
cacheBean: List<HomeHeaderBean.AskCategoryDataBean>?
): Boolean {
if (bean?.size != cacheBean?.size) {
return true
}
for (index in 0 until bean?.size!!) {
if (!bean[index].url.equals(cacheBean!![index].url)
|| !bean[index].coverUrl.equals(cacheBean!![index].coverUrl)
|| !bean[index].cateTitle.equals(cacheBean!![index].cateTitle)
|| bean[index].cateId != cacheBean!![index].cateId
) {
return true
}
}
return false
}
/**
* 刷新View
*/
private fun refreshView() {
var i = 0
if (null == imageViewCache) {
imageViewCache = ArrayList()
}
if (null == textViewCache) {
textViewCache = ArrayList()
}
var imageCount = imageViewCache!!.size
for (item in mDataList!!) {
if (i > 7) {
break
}
if (i >= imageCount) {
val imageView = createIcon(i)
val textView = createText(i)
(imageViewCache as ArrayList).add(imageView)
(textViewCache as ArrayList).add(textView)
homeModulePagerBannerFlRoot.addView(imageView)
homeModulePagerBannerFlRoot.addView(textView)
imageView.setOnClickListener {
homeEvent!!.categoryClick(item)
}
textView.setOnClickListener {
homeEvent!!.categoryClick(item)
}
}
bindIconData(imageViewCache!![i], item)
bindTextData(textViewCache!![i], item)
i++
}
}
/**
* 创建图标
*/
private fun createIcon(i: Int): ImageView {
val imageParams = FrameLayout.LayoutParams(imageViewWidth, imageViewWidth)
val imageView = ImageView(context)
imageView.scaleType = ImageView.ScaleType.CENTER_CROP
if (i > 3) {
multiple = 2
imageParams.topMargin = imageViewWidth + dp8 + textViewHeight
imageParams.leftMargin = margin * (i - 3) + (i - 4) * (imageViewWidth + margin)
} else {
multiple = 1
imageParams.leftMargin = margin * (i + 1) + i * (imageViewWidth + margin)
}
imageView.layoutParams = imageParams
return imageView
}
/**
* 加载图片
*/
private fun bindIconData(
imageView: ImageView,
categoryBean: HomeHeaderBean.AskCategoryDataBean
) {
GlideApp.with(context).load(categoryBean.coverUrl)
.centerCrop().into(imageView)
}
/**
* 创建文本
*/
private fun createText(index: Int): TextView {
val textParams = FrameLayout.LayoutParams(textViewWidth, textViewHeight)
val textView = TextView(context)
textView.setTextColor(Color.parseColor("#242424"))
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12f)
textView.gravity = Gravity.CENTER_HORIZONTAL
if (index > 3) {
textParams.topMargin = 2 * (imageViewWidth + dp8) + textViewHeight
textParams.leftMargin = textViewWidth * (index - 4)
} else {
textParams.topMargin = imageViewWidth + dp8
textParams.leftMargin = textViewWidth * (index)
}
textView.layoutParams = textParams
return textView
}
/**
* 设置文本
*/
private fun bindTextData(textView: TextView, categoryBean: HomeHeaderBean.AskCategoryDataBean) {
textView.text = categoryBean.cateTitle
}
/**
* 初始化实时测评状态View
*/
private fun initRealTextView() {
if (null == realTestView) {
var realTestParam = FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
realTestParam.topMargin =
multiple * (imageViewWidth + dp8 + textViewHeight) + dp8 + RxImageTool.dip2px(10f)
realTestView = HomePagerBannerRealView(context, homeEvent!!)
realTestView!!.layoutParams = realTestParam
}
}
private fun initLineView() {
var lineParam =
FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, RxImageTool.dip2px(0.5f))
var dp15 = RxImageTool.dip2px(15f)
lineParam.leftMargin = dp15
lineParam.rightMargin = dp15
lineParam.topMargin = multiple * (imageViewWidth + dp8 + textViewHeight) + dp8
lineView = View(context)
lineView!!.setBackgroundColor(resources.getColor(R.color.home_module_category_view_test_line))
lineView!!.layoutParams = lineParam
}
/**
* 实时测评状态赋值
*/
private fun setRealTextView(list: List<HomeHeaderBean.HomeSaleDataBean>?) {
if (!hasRealTestView) {
initLineView()
homeModulePagerBannerFlRoot.addView(lineView)
initRealTextView()
homeModulePagerBannerFlRoot.addView(realTestView)
hasRealTestView = true
}
realTestView!!.initData(list)
}
fun onDestory() {
if (null == realTestView) {
return
}
realTestView!!.onDestory()
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.view.View
import android.view.ViewGroup
import android.view.animation.Animation
import android.view.animation.DecelerateInterpolator
import android.view.animation.TranslateAnimation
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeHeaderBean
import kotlinx.android.synthetic.xlzx.home_module_real_view_in.view.*
import kotlinx.android.synthetic.xlzx.home_module_real_view_left.view.*
import kotlinx.android.synthetic.xlzx.home_module_real_view_out.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 首页顶部模块-动态标签模块
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/16
*/
class HomePagerBannerRealView(mContext: Context, homeEvent: IHomeBaseEvent) :
LinearLayout(mContext) {
private val STATUS_IN = 0
private val STATUS_OUT = 1
private var curTipIndex = 0
private var lastTimeMillis: Long = 0
private val ANIM_DELAYED_MILLIONS = 2 * 1000
/**
* 动画持续时长
*/
private val ANIM_DURATION = 500
/**
* 进、出 两个view (主要用于做动画,其实是两个相同的布局文件)
*/
private var view_out: View? = null
private var view_in: View? = null
/**
* 进、出 两个View 的动画
*/
private var anim_out: Animation? = null
private var anim_in: Animation? = null
/**
* 数据缓存
*/
private var mDataList: List<HomeHeaderBean.HomeSaleDataBean>? = null
private var homeEvent: IHomeBaseEvent? = null
private val mHandler: Handler = object : Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message?) {
super.handleMessage(msg)
updateTipAndPlayAnimation()
sendMessageDelayed(Message(), ANIM_DELAYED_MILLIONS.toLong())
}
}
init {
this.homeEvent = homeEvent
initView()
initAnimation()
}
/**
* 界面初始化
*/
private fun initView() {
orientation = HORIZONTAL
var params = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
View.inflate(context, R.layout.home_module_real_view_left, this)
view_out = View.inflate(context, R.layout.home_module_real_view_out, null)
view_in = View.inflate(context, R.layout.home_module_real_view_in, null)
homeModuleRealViewLeftFrameLayout.addView(view_out)
homeModuleRealViewLeftFrameLayout.addView(view_in)
layoutParams = params
}
private fun initAnimation() {
anim_out = newAnimation(0f, -1f)
anim_in = newAnimation(1f, 0f)
anim_in!!.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationStart(animation: Animation) {
}
override fun onAnimationRepeat(animation: Animation) {
}
override fun onAnimationEnd(animation: Animation) {
updateViewVisibility()
}
})
}
/**
* 设置数据
*/
fun initData(list: List<HomeHeaderBean.HomeSaleDataBean>?) {
mHandler.removeCallbacksAndMessages(null)
if (null == list || list.isEmpty()) {
visibility = View.GONE
return
}
visibility = View.VISIBLE
if (null == mDataList) {
mDataList = ArrayList()
} else {
(mDataList as ArrayList).clear()
}
(mDataList as ArrayList).addAll(list)
curTipIndex = 0
updateTip(STATUS_OUT)
updateTipAndPlayAnimation()
mHandler.sendMessageDelayed(Message(), ANIM_DELAYED_MILLIONS.toLong())
}
private fun updateViewVisibility() {
if (curTipIndex % 2 == 0) {
view_out!!.visibility = View.INVISIBLE
} else {
view_in!!.visibility = View.INVISIBLE
}
}
private fun newAnimation(fromYValue: Float, toYValue: Float): Animation {
val anim = TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f,
Animation.RELATIVE_TO_SELF, fromYValue, Animation.RELATIVE_TO_SELF, toYValue
)
anim.duration = ANIM_DURATION.toLong()
anim.interpolator = DecelerateInterpolator()
return anim
}
private fun updateTipAndPlayAnimation() {
view_in!!.visibility = View.VISIBLE
view_out!!.visibility = View.VISIBLE
if (curTipIndex % 2 == 0) {
updateTip(STATUS_OUT)
view_in!!.startAnimation(anim_out)
view_out!!.startAnimation(anim_in)
this.bringChildToFront(view_in)
} else {
updateTip(STATUS_IN)
view_out!!.startAnimation(anim_out)
view_in!!.startAnimation(anim_in)
this.bringChildToFront(view_out)
}
}
private fun updateTip(status: Int) {
val bodyBean = getNextTip() ?: return
when (status) {
STATUS_IN -> {
tv_in_doctor_name.text = bodyBean.doctorName
tv_in_content_before.text = getName(bodyBean)
tv_in_content_after.text = String.format("老师%s", bodyBean.contentAfter)
view_in!!.setOnClickListener {
homeEvent!!.linkTo(bodyBean.url!!)
}
}
STATUS_OUT -> {
tv_out_doctor_name.text = bodyBean.doctorName
tv_out_content_before.text = getName(bodyBean)
tv_out_content_after.text = String.format("老师%s", bodyBean.contentAfter)
view_out!!.setOnClickListener {
homeEvent!!.linkTo(bodyBean.url!!)
}
}
}
}
private fun getName(bean: HomeHeaderBean.HomeSaleDataBean?): String {
var nameBuffer = StringBuffer()
nameBuffer.append(bean?.contentBefore)
nameBuffer.append(" ")
nameBuffer.append(bean?.nickName)
nameBuffer.append(resources.getString(R.string.home_module_real_appoint))
return nameBuffer.toString()
}
private fun getNextTip(): HomeHeaderBean.HomeSaleDataBean? {
if (null == mDataList || mDataList!!.isEmpty()) {
return null
}
return mDataList!![curTipIndex++ % mDataList!!.size]
}
fun onDestory() {
mHandler.removeCallbacksAndMessages(null)
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.view.View
import android.view.ViewGroup
import android.widget.RelativeLayout
import com.ydl.ydlcommon.view.banner.GlideImageLoader
import com.yidianling.common.tools.RxDeviceTool
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeHeaderBean
import kotlinx.android.synthetic.xlzx.home_module_pager_banner_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述:顶部ViewPager与分类模块
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class HomePagerBannerView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) :
RelativeLayout(mContext) {
private val mImageViews = ArrayList<String>()
private var homePagerBannerCategoryView: HomePagerBannerCategoryView? = null
init {
initView()
}
private fun initView() {
var screenWidth = RxDeviceTool.getScreenWidth(mContext)
val params = RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams = params
View.inflate(mContext, R.layout.home_module_pager_banner_view, this)
initBannerLayout()
// val addLayoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
// addLayoutParams.setMargins(0, (ScreenUtil.screenWidth * (356f / 750f)).toInt(),0,0)
// homeModulePagerBannerViewAddLayout.layoutParams = addLayoutParams
// if (null == homePagerBannerCategoryView) {
// homePagerBannerCategoryView = HomePagerBannerCategoryView(mContext, homeEvent!!)
// homeModulePagerBannerViewAddLayout.addView(homePagerBannerCategoryView)
// }
}
private fun initBannerLayout() {
// var screenWidth = RxDeviceTool.getScreenWidth(mContext)
// var viewHeight = screenWidth * 508 / 750
// val params = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, viewHeight)
// homeModulePagerBannerViewBanner.layoutParams = params
homeModulePagerBannerViewBanner.setIndicatorBottomPadding(50)
}
/**
* 填充数据
*/
fun initData(bean: HomeHeaderBean?) {
initCategory(bean?.askCategoryData, bean?.homeSaleData)
initBanner(bean?.focusList)
}
/**
* 更新分类细目
*/
private fun initCategory(
categoryBean: List<HomeHeaderBean.AskCategoryDataBean>?,
homeSaleData: List<HomeHeaderBean.HomeSaleDataBean>?
) {
homePagerBannerCategoryView!!.initData(categoryBean, homeSaleData)
}
/**
* 更新banner
*/
private fun initBanner(focusListBean: List<HomeHeaderBean.FocusListBean>?) {
//临时缓存集合
val cacheList = ArrayList<HomeHeaderBean.FocusListBean>()
if (null != focusListBean && focusListBean.isNotEmpty()) {
mImageViews.clear()
//产品说取前8个
if (focusListBean.size > 8) {
cacheList.addAll(focusListBean.subList(0, 8))
} else {
cacheList.addAll(focusListBean)
}
for (item in cacheList) {
mImageViews.add(item.imageUrl!!)
}
}
homeModulePagerBannerViewBanner.setImageLoader(GlideImageLoader(R.drawable.home_module_image_default_back))
.setImages(mImageViews).start()
homeModulePagerBannerViewBanner.setOnBannerListener {
homeEvent?.bannerClick(cacheList!![it])
}
}
fun startBanner() {
if (homeModulePagerBannerViewBanner != null) {
homeModulePagerBannerViewBanner.startAutoPlay()
}
}
fun stopBanner() {
if (homeModulePagerBannerViewBanner != null) {
homeModulePagerBannerViewBanner.stopAutoPlay()
}
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.ydl.ydl_image.manager.YDLImageCacheManager
import com.yidianling.common.tools.RxImageTool
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeTestItemBean
import kotlinx.android.synthetic.xlzx.home_module_test_item_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 心灵电台模块item
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/14
*/
class HomeTestItemView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) :
LinearLayout(mContext) {
private var params: LinearLayout.LayoutParams? = null
init {
initView()
}
private fun initView() {
orientation = VERTICAL
params = LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams = params
View.inflate(mContext, R.layout.home_module_test_item_view, this)
}
/**
* 刷新数据
*/
fun updateData(bean: HomeTestItemBean, isLast: Boolean) {
tv_test_item_name.text = bean.name
tv_test_item_hit.text = bean.hits.toString()
tv_tested_count.text = bean.testNum.toString()
YDLImageCacheManager.showImage(mContext, bean?.shareImage, iv_test_item)
if (isLast) {
view_test_line.visibility = View.GONE
} else {
view_test_line.visibility = View.VISIBLE
}
this.setOnClickListener {
homeEvent?.testItemClick(bean.recommendLinkUrl)
}
}
/**
* 电台第二个item会有一个marginTop值
*/
fun setTopMargin() {
params?.topMargin = RxImageTool.dp2px(16f)
layoutParams = params
}
/**
* 电台最后一个item会有一个marginBottom值
*/
fun setBottomMargin() {
params?.bottomMargin = RxImageTool.dp2px(16f)
layoutParams = params
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.view.View
import android.widget.LinearLayout
import com.ydl.ydl_image.config.ISimpleImageOpConfig
import com.ydl.ydl_image.config.SimpleImageOpConfiger
import com.ydl.ydl_image.manager.YDLImageCacheManager
import com.yidianling.common.tools.RxDeviceTool
import com.yidianling.common.tools.RxImageTool
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeTestItemBean
import kotlinx.android.synthetic.xlzx.home_module_test_top_item_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 心灵电台模块item--顶部item
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/15
*/
class HomeTestTopItemView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) :
LinearLayout(mContext) {
init {
initView()
}
private fun initView() {
orientation = VERTICAL
var screenWidth = RxDeviceTool.getScreenWidth(mContext)
var viewWidth = (screenWidth - 2 * 15 * RxDeviceTool.getScreenDensity(mContext)).toInt()
var viewHeight = viewWidth * 143 / 345
val params = LinearLayout.LayoutParams(viewWidth, viewHeight)
layoutParams = params
View.inflate(mContext, R.layout.home_module_test_top_item_view, this)
}
/**
* 刷新数据
*/
fun updateData(bean: HomeTestItemBean) {
var screenWidth = RxDeviceTool.getScreenWidth(mContext)
var viewWidth = (screenWidth - RxImageTool.dip2px(30f))
var viewHeight = viewWidth * 143 / 345
val sp = SimpleImageOpConfiger()
sp.loadingPic = R.drawable.platform_default_img
sp.errorPic = R.drawable.platform_default_img
sp.scaleType = ISimpleImageOpConfig.CENTER_CROP
sp.isCacheOnDisk = true
YDLImageCacheManager.showImage(
mContext,
bean?.shareImage,
homeModuleIntelligentTopViewImage,
viewWidth,
viewHeight,
sp
)
homeModuleIntelligentTopViewTitle.text = bean.name
homeModuleIntelligentTopViewAuthor.text = bean.hits.toString()
homeModuleIntelligentTopViewHits.text = bean.testNum.toString()
this.setOnClickListener {
homeEvent?.testItemClick(bean.recommendLinkUrl)
}
}
}
\ No newline at end of file
package com.yidianling.home.ui.view
import android.content.Context
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.HomeImpl
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.model.bean.HomeTestItemBean
import kotlinx.android.synthetic.xlzx.home_module_test_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 心灵*电台模块
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeTestView(private val mContext: Context, private var homeEvent: HomeImpl?) : LinearLayout(mContext) {
private var cacheList : ArrayList<HomeTestItemBean> = ArrayList()
init {
initView()
}
private fun initView() {
orientation = VERTICAL
val params = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
layoutParams = params
View.inflate(mContext, R.layout.home_module_test_view, this)
homeModuleIntelligentViewHomeCommonTitleView.setTitle("测试·分析")
homeModuleIntelligentViewHomeCommonTitleView.setOnClickListener {
homeEvent?.testMoreClick()
}
}
fun initData(list: List<HomeTestItemBean>?) {
//添加View
if(list==null){
return
}
if (cacheList.size != list?.size){
cacheList.clear()
cacheList.addAll(list!!)
updateHomeTestItemViewNumber()
}
for (index in 0 until homeModuleIntelligentViewAddLayout.childCount){
val itemView = homeModuleIntelligentViewAddLayout.getChildAt(index)
if (itemView is HomeTestItemView){
//第一个这种类型item,需要设置marginTop = 16dp,最后一个item需要设置marginBototm = 16dp
if (index == 1) {
itemView.setTopMargin()
}
// else if (index == homeModuleIntelligentViewAddLayout.childCount -1) {
// itemView.setBottomMargin()
// }
itemView.updateData(list[index],index == list.size - 1)
}else if (itemView is HomeTestTopItemView) {
itemView.updateData(list[index])
}
}
}
/**
* 更新itemView的数量以适应新的数据集
*/
private fun updateHomeTestItemViewNumber() {
var childCountRecord = homeModuleIntelligentViewAddLayout.childCount
while (cacheList.size > childCountRecord) {
if (childCountRecord == 0) {
homeModuleIntelligentViewAddLayout.addView(HomeTestTopItemView(mContext, homeEvent))
}else {
homeModuleIntelligentViewAddLayout.addView(HomeTestItemView(mContext, homeEvent))
}
childCountRecord++
}
while (cacheList.size < childCountRecord &&
(homeModuleIntelligentViewAddLayout.getChildAt(childCountRecord -1 ) is HomeTestItemView
|| homeModuleIntelligentViewAddLayout.getChildAt(childCountRecord -1 ) is HomeTestTopItemView)) {
homeModuleIntelligentViewAddLayout.removeViewAt(childCountRecord -1 )
childCountRecord--
}
}
}
\ No newline at end of file
package com.yidianling.home.ui.widget
import android.content.Context
import android.graphics.Color
import android.util.AttributeSet
import android.util.TypedValue
import android.view.Gravity
import android.view.View
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.TextView
import com.ydl.ydl_image.module.GlideApp
import com.ydl.ydlcommon.utils.ScreenUtil
import com.yidianling.common.tools.RxImageTool
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeHeaderBean
import com.yidianling.home.ui.view.HomePagerBannerRealView
import kotlinx.android.synthetic.xlzx.home_module_pager_banner_category_view.view.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 首页顶部模块-分类模块
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/16
*/
class HomeModuleCategoryView : FrameLayout {
/**
* 数据缓存
*/
var mDataList: ArrayList<HomeHeaderBean.AskCategoryDataBean>? = null
/**
* 分类view宽度
*/
var categoryWidth: Int = 0
/**
* 图片宽高
*/
var imageViewWidth: Int = 0
/**
* 文本宽度
*/
var textViewWidth: Int = 0
/**
* 文本高度
*/
var textViewHeight: Int = 0
/**
* 间隔
*/
var margin: Int = 0
var dp8: Int = 0
private var realTestView: HomePagerBannerRealView? = null
/**
* 倍数
*/
private var multiple: Int = 0
/**
* 测评首页事件处理类
*/
private var homeEvent: IHomeBaseEvent? = null
constructor(context: Context?) : super(context) {
HomeModuleCategoryView(context, null)
}
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {
initView();
}
fun setEvent(homeEvent: IHomeBaseEvent) {
this.homeEvent = homeEvent
}
/**
* 界面初始化
*/
private fun initView() {
View.inflate(context, R.layout.home_module_pager_banner_category_view, this)
val params = FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.WRAP_CONTENT
)
// params.topMargin = ScreenUtil.screenHeight * (356f / 750f).toInt()
layoutParams = params
initArgs()
}
/**
* 初始化变量
*/
private fun initArgs() {
categoryWidth = ScreenUtil.screenWidth - RxImageTool.dp2px(30f)
textViewWidth = categoryWidth / 4
imageViewWidth = RxImageTool.dip2px(38f)
margin = (categoryWidth - 4 * imageViewWidth) / 8
dp8 = RxImageTool.dip2px(8f)
//高度=文字12dp+16dp间距
textViewHeight = RxImageTool.dip2px(28f)
}
fun initData(askCategoryDataBean: List<HomeHeaderBean.AskCategoryDataBean>?) {
if (null == askCategoryDataBean || askCategoryDataBean.isEmpty()) {
visibility = View.GONE
return
}
visibility = View.VISIBLE
if (null == mDataList) {
mDataList = ArrayList()
}
if (getChange(askCategoryDataBean, mDataList)) {
mDataList!!.clear()
mDataList!!.addAll(askCategoryDataBean)
}
refreshView()
}
/**
* 判断数据是否变化
*/
private fun getChange(
bean: List<HomeHeaderBean.AskCategoryDataBean>?,
cacheBean: List<HomeHeaderBean.AskCategoryDataBean>?
): Boolean {
if (bean?.size != cacheBean?.size) {
return true
}
for (index in 0 until bean?.size!!) {
if (!bean[index].url.equals(cacheBean!![index].url)
|| !bean[index].coverUrl.equals(cacheBean!![index].coverUrl)
|| !bean[index].cateTitle.equals(cacheBean!![index].cateTitle)
|| bean[index].cateId != cacheBean!![index].cateId
) {
return true
}
}
return false
}
/**
* 刷新View
*/
private fun refreshView() {
homeModulePagerBannerFlRoot.removeAllViews()
var i = 0
for (item in mDataList!!) {
if (i > 7) {
break
}
val imageView = createIcon(i)
val textView = createText(i)
homeModulePagerBannerFlRoot.addView(imageView)
homeModulePagerBannerFlRoot.addView(textView)
imageView.setOnClickListener {
homeEvent!!.categoryClick(item)
}
textView.setOnClickListener {
homeEvent!!.categoryClick(item)
}
bindIconData(imageView, item)
bindTextData(textView, item)
i++
}
}
/**
* 创建图标
*/
private fun createIcon(i: Int): ImageView {
val imageParams = FrameLayout.LayoutParams(imageViewWidth, imageViewWidth)
val imageView = ImageView(context)
imageView.scaleType = ImageView.ScaleType.CENTER_CROP
if (i > 3) {
multiple = 2
imageParams.topMargin =
imageViewWidth + dp8 + textViewHeight + dp8 + RxImageTool.dip2px(1f)
imageParams.leftMargin = margin * (i - 3) + (i - 4) * (imageViewWidth + margin)
} else {
multiple = 1
imageParams.leftMargin = margin * (i + 1) + i * (imageViewWidth + margin)
}
imageView.layoutParams = imageParams
return imageView
}
/**
* 加载图片
*/
private fun bindIconData(
imageView: ImageView,
categoryBean: HomeHeaderBean.AskCategoryDataBean
) {
GlideApp.with(context).load(categoryBean.coverUrl)
.centerCrop().into(imageView)
}
/**
* 创建文本
*/
private fun createText(index: Int): TextView {
val textParams = FrameLayout.LayoutParams(textViewWidth, textViewHeight)
val textView = TextView(context)
textView.setTextColor(Color.parseColor("#444444"))
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12f)
textView.gravity = Gravity.CENTER_HORIZONTAL
if (index > 3) {
textParams.topMargin = 2 * (imageViewWidth + dp8) + textViewHeight + dp8
textParams.leftMargin = textViewWidth * (index - 4)
} else {
textParams.topMargin = imageViewWidth + dp8
textParams.leftMargin = textViewWidth * (index)
}
textView.layoutParams = textParams
return textView
}
/**
* 设置文本
*/
private fun bindTextData(textView: TextView, categoryBean: HomeHeaderBean.AskCategoryDataBean) {
textView.text = categoryBean.cateTitle
}
fun onDestory() {
if (null == realTestView) {
return
}
realTestView!!.onDestory()
}
}
\ No newline at end of file
package com.yidianling.home.utils
import android.util.Log
/**
* Created by haorui on 2019/2/16.
* Des:
*/
class HomeLogPrinter {
companion object {
/**
* 解决LogCat打印长数据不完整问题
*/
fun printLongLog(tag: String, msg: String) {
var msg = msg
val maxStrLength = 2001 - tag.length
while (msg.length > maxStrLength) {
Log.i(tag, msg.substring(0, maxStrLength))
msg = msg.substring(maxStrLength)
}
Log.i(tag, msg)
}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false"
>
<item
android:drawable="@drawable/confide_play_state_3"
android:duration="0"/>
<item
android:drawable="@drawable/confide_play_state_1"
android:duration="300"/>
<item
android:drawable="@drawable/confide_play_state_2"
android:duration="300"/>
<item
android:drawable="@drawable/confide_play_state_3"
android:duration="300"/>
</animation-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true">
<shape>
<corners android:radius="20dp"/>
<gradient android:endColor="#FAD642" android:startColor="#FA5729" />
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true">
<shape>
<corners android:radius="0dp"></corners>
<gradient android:endColor="#05cbfc" android:startColor="#3484da" />
<stroke android:width="0dp" android:color="@color/platform_bebebe" />
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="40dp"/>
<solid android:color="@android:color/white" />
<stroke android:width="1px" android:color="#E6E6E6"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/platform_color_F7F7F7" />
<corners android:radius="@dimen/platform_dp_12"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#FFE433"
android:endColor="@color/platform_color_FFDD33"/>
<corners android:bottomRightRadius="@dimen/platform_dp_8" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/platform_color_FFDD33" />
<corners android:radius="@dimen/platform_dp_3" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/platform_color_F7F7F7" />
<corners android:radius="@dimen/platform_dp_4"/>
<stroke android:width="1dp"
android:color="@color/platform_color_FFFFFF"
/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke android:width="1dp"
android:color="@color/platform_color_E6E6E6" />
<corners android:radius="@dimen/platform_dp_19" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/platform_color_FFDD33" />
<corners
android:topLeftRadius="@dimen/platform_dp_4"
android:bottomRightRadius="@dimen/platform_dp_4" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke android:color="@color/platform_color_EBEBEB"
android:width="0.5dp" />
<solid android:color="@color/platform_color_FFFFFF" />
<corners
android:radius="@dimen/platform_dp_10"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/platform_color_FFDD33"/>
<corners android:radius="@dimen/platform_dp_2"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="1px"
android:color="@color/platform_color_60FF5A4C" />
<solid android:color="@color/platform_color_5FF5A4C" />
<corners android:radius="@dimen/platform_dp_8" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/platform_color_FFDD33" />
<corners android:radius="@dimen/platform_dp_12" />
<padding
android:bottom="@dimen/platform_dp_3"
android:left="@dimen/platform_dp_10"
android:right="@dimen/platform_dp_10"
android:top="@dimen/platform_dp_3" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:angle="180"
android:startColor="#F0F0F0"
android:endColor="#F0F0F0"/>
<corners android:radius="@dimen/platform_dp_12" />
<padding
android:bottom="@dimen/platform_dp_3"
android:left="@dimen/platform_dp_10"
android:right="@dimen/platform_dp_10"
android:top="@dimen/platform_dp_3" />
<stroke android:color="#F0F0F0"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:endColor="#00ffffff"
android:startColor="#49f1f1f1"
android:angle="180"
/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/platform_color_EBEBEB" />
<corners android:radius="4dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/platform_color_E0E0E0" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient android:startColor="#00000000"
android:endColor="@color/platform_color_66000000"
android:angle="270"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/platform_color_70FFFFFF" />
<corners android:topRightRadius="@dimen/platform_dp_9"
android:bottomLeftRadius="@dimen/platform_dp_9"
android:bottomRightRadius="@dimen/platform_dp_9" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/platform_color_FFDD33" />
<corners android:topRightRadius="@dimen/platform_dp_6"
android:bottomLeftRadius="@dimen/platform_dp_6" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:color="@color/platform_color_CCCCCC"
android:width="0.5dp"/>
<corners
android:radius="@dimen/platform_dp_12"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
android:color="@color/platform_color_FFDD33"/>
<size
android:width="120dp"
android:height="120dp"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/platform_color_70FFFFFF" />
<corners
android:bottomLeftRadius="@dimen/platform_dp_20"
android:bottomRightRadius="@dimen/platform_dp_20"
android:topRightRadius="@dimen/platform_dp_20"
/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 阴影部分 -->
<item
android:bottom="2dp"
android:left="2dp"
android:right="2dp"
android:top="2dp">
<shape android:shape="rectangle">
<gradient
android:angle="270"
android:endColor="#32f4f4f4"
android:startColor="#32f4f4f4"/>
<corners
android:radius="10dp"/>
</shape>
</item>
<!-- 背景部分 -->
<item
android:bottom="3dp"
android:left="3dp"
android:right="3dp"
android:top="3dp">
<shape android:shape="rectangle">
<stroke
android:width="0.5dp"
android:color="#f4f4f4"/>
<gradient
android:angle="270"
android:endColor="#FFFFFF"
android:startColor="#FFFFFF"/>
<corners
android:radius="10dp"/>
</shape>
</item>
</layer-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#99000000">
<ImageView
android:id="@+id/img_activity"
android:layout_width="350dp"
android:layout_height="400dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"/>
<ImageView
android:id="@+id/img_close"
android:layout_width="32dp"
android:layout_height="32dp"
app:layout_constraintTop_toBottomOf="@+id/img_activity"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginTop="20dp"
android:src="@mipmap/ico_close"/>
</android.support.constraint.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="wrap_content"
android:background="#00000000"
android:gravity="center_horizontal"
android:orientation="vertical">
<android.support.v7.widget.CardView
android:layout_width="267dp"
android:layout_height="292dp"
app:cardCornerRadius="10dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="119dp"
android:background="@mipmap/coupon_background"
android:gravity="center_horizontal|center_vertical"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:src="@drawable/coupon_receiver" />
<TextView
android:id="@+id/tv_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="9dp"
android:textColor="@color/platform_white"
android:textSize="16sp"
tools:text="恭喜您,领取成功" />
</LinearLayout>
<RelativeLayout
android:layout_width="227dp"
android:layout_height="90dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="-16dp"
android:background="@mipmap/cotent_backgroudn"
android:paddingLeft="14dp"
android:paddingRight="14dp"
android:paddingTop="16dp">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_marginRight="5dp"
android:layout_toLeftOf="@+id/tv_money"
android:textColor="#666666"
android:textSize="14sp"
tools:text="咨询优惠券咨询优惠券" />
<TextView
android:id="@+id/tv_duration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_title"
android:layout_marginTop="4dp"
android:textColor="#999999"
android:textSize="10sp"
tools:text="有效期至2018-08-31" />
<TextView
android:id="@+id/tv_money"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/tv_unit"
android:layout_toStartOf="@+id/tv_unit"
android:textColor="@color/darkorange"
android:textSize="25sp"
android:textStyle="bold"
tools:text="¥50" />
<TextView
android:id="@+id/tv_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginTop="10dp"
android:text="元"
android:textColor="@color/darkorange"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_limit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="10dp"
android:textColor="#999999"
android:textSize="10sp"
tools:text="满500元可用" />
</RelativeLayout>
<TextView
android:id="@+id/tv_ensure"
android:layout_width="192dp"
android:layout_height="42dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:background="@drawable/background_coupon_button"
android:gravity="center"
android:textColor="@color/platform_white"
android:textSize="15sp"
tools:text="立即领取" />
</LinearLayout>
</android.support.v7.widget.CardView>
<ImageView
android:id="@+id/iv_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="37dp"
android:background="@drawable/pop_close"
android:padding="10dp" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/c_body"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:background="#99000000">
<ImageView
android:id="@+id/img_activity"
android:layout_width="64dp"
android:layout_height="34dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"/>
<ImageView
android:id="@+id/img_line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/activity_guide"
app:layout_constraintTop_toBottomOf="@+id/img_activity"
app:layout_constraintLeft_toLeftOf="@+id/img_activity"
app:layout_constraintRight_toRightOf="@+id/img_activity"/>
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="24dp"
tools:text="这里可以进入双11活动哦"
app:layout_constraintBottom_toBottomOf="@+id/img_line"
app:layout_constraintLeft_toRightOf="@+id/img_line"
android:layout_marginLeft="14dp"
android:textSize="16dp"
android:textColor="@color/platform_white"/>
</android.support.constraint.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/home_swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false">
<android.support.design.widget.CoordinatorLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBg"
android:clipChildren="false"
android:clipToPadding="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
>
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorBg"
android:clipChildren="false"
android:clipToPadding="false"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:elevation="0dp">
<android.support.design.widget.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<include layout="@layout/layout_home_module_head_bg"/>
<include
layout="@layout/layout_home_module_head_middle"/>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/home_title_bar_height"
android:alpha="0"
android:background="@android:color/white"
android:tag="toolbar"
android:visibility="gone"
app:layout_collapseMode="pin"
app:popupTheme="@style/Widget.AppCompat.Toolbar"/>
<include layout="@layout/layout_home_module_toolbar"/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<include layout="@layout/layout_home_module_content"/>
<include layout="@layout/layout_home_module_input"/>
</android.support.design.widget.CoordinatorLayout>
</android.support.v4.widget.SwipeRefreshLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:paddingLeft="@dimen/platform_dp_15"
android:paddingRight="@dimen/platform_dp_15"
android:paddingTop="@dimen/platform_dp_15">
<android.support.v7.widget.CardView
android:id="@+id/homeModuleArticleItemViewCardImg"
android:layout_width="@dimen/platform_dp_127"
android:layout_height="@dimen/platform_dp_88"
android:layout_alignParentRight="true"
app:cardCornerRadius="@dimen/platform_dp_6"
app:cardElevation="0dp">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:id="@+id/homeModuleArticleItemViewImg"
android:background="@drawable/home_module_image_default_back"/>
</android.support.v7.widget.CardView>
<TextView
android:id="@+id/homeModuleArticleItemViewTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="2"
android:ellipsize="end"
android:textSize="@dimen/platform_dp_18"
android:textStyle="bold"
android:layout_marginTop="-2dp"
android:textColor="@color/platform_color_222222"
android:layout_alignParentTop="true"
android:lineSpacingExtra="@dimen/platform_dp_1"
tools:text="喧嚣的世界中,你的重要何以而来?喧嚣的世界中,你的重要何以而来?"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@+id/homeModuleArticleItemViewCardImg"
android:layout_marginRight="@dimen/platform_dp_20"/>
<TextView
android:id="@+id/homeModuleArticleItemViewContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="2"
android:ellipsize="end"
android:textSize="@dimen/platform_dp_13"
android:layout_marginTop="@dimen/platform_dp_6"
android:textColor="@color/platform_color_666666"
android:layout_alignParentLeft="true"
android:layout_below="@+id/homeModuleArticleItemViewTitle"
android:lineSpacingExtra="@dimen/platform_dp_3"
tools:text="喧嚣的世界中,你的重要何以而来?当我伫立在我所伫立之处..."
android:layout_toLeftOf="@+id/homeModuleArticleItemViewCardImg"
android:layout_marginRight="@dimen/platform_dp_20"/>
<LinearLayout
android:id="@+id/homeModuleArticleItemViewBottomLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:layout_below="@+id/homeModuleArticleItemViewCardImg"
android:layout_marginTop="@dimen/platform_dp_16">
<ImageView
android:id="@+id/homeModuleArticleItemViewIcon"
android:layout_width="@dimen/platform_dp_12"
android:layout_height="@dimen/platform_dp_12"
android:src="@drawable/home_module_article_item_icon"
android:layout_marginTop="1dp"
android:layout_alignParentLeft="true"/>
<TextView
android:id="@+id/homeModuleArticleItemViewAuthor"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:textSize="@dimen/platform_dp_12"
android:textColor="@color/platform_color_242424"
android:layout_marginLeft="@dimen/platform_dp_3"
android:textStyle="bold"
tools:text="赵秀英"/>
<TextView
android:id="@+id/homeModuleArticleItemViewGreatNum"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="3327"
android:textSize="@dimen/platform_dp_12"
android:textColor="@color/platform_color_242424"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点赞"
android:textSize="@dimen/platform_dp_11"
android:layout_marginRight="@dimen/platform_dp_12"
android:textColor="@color/platform_color_666666"/>
<TextView
android:id="@+id/homeModuleArticleItemViewLookNum"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="2656"
android:textSize="@dimen/platform_dp_12"
android:textColor="@color/platform_color_242424"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="浏览"
android:textSize="@dimen/platform_dp_11"
android:textColor="@color/platform_color_666666"/>
</LinearLayout>
<View
android:id="@+id/homeModuleArticleItemViewBottomLine"
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="@color/platform_color_EBEBEB"
android:layout_centerInParent="true"
android:layout_below="@+id/homeModuleArticleItemViewBottomLayout"
android:layout_marginTop="@dimen/platform_dp_20"/>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.yidianling.home.ui.view.HomeCommonTitleView
android:id="@+id/homeModuleArticleViewHomeCommonTitleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</merge>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_weight="210"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/homeModuleAssuageGriefUnderFiveItemViewFirstImg"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="118"
android:background="@drawable/home_module_image_default_back"/>
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:background="@color/platform_color_FFFFFF"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="60">
<ImageView
android:id="@+id/homeModuleAssuageGriefUnderFiveItemViewThirdImg"
android:scaleType="centerCrop"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="104"
android:background="@drawable/home_module_image_default_back"/>
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:background="@color/platform_color_FFFFFF"/>
<ImageView
android:id="@+id/homeModuleAssuageGriefUnderFiveItemViewFourthImg"
android:scaleType="centerCrop"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="104"
android:background="@drawable/home_module_image_default_back"/>
</LinearLayout>
</LinearLayout>
<View
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="match_parent"
android:background="@color/platform_color_FFFFFF"/>
<LinearLayout
android:layout_width="0dp"
android:layout_weight="103"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/homeModuleAssuageGriefUnderFiveItemViewSecondImg"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="118"
android:background="@drawable/home_module_image_default_back"/>
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:background="@color/platform_color_FFFFFF"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="60">
<ImageView
android:id="@+id/homeModuleAssuageGriefUnderFiveItemViewFiveImg"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/home_module_image_default_back"/>
<TextView
android:id="@+id/homeModuleAssuageGriefUnderFiveItemViewTag"
android:layout_width="30dp"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="@dimen/platform_dp_5"
android:layout_marginRight="@dimen/platform_dp_5"
android:background="@drawable/home_module_assuage_grief_item_view_image_num_back"
android:gravity="center"
tools:text="9图"
android:textColor="@color/platform_color_242424"
android:textSize="@dimen/platform_dp_10" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</merge>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:id="@+id/homeModuleAssuageGriefUnderFourItemViewFirstImg"
android:layout_width="0dp"
android:layout_weight="156"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:background="@drawable/home_module_image_default_back"/>
<View
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="match_parent"
android:background="@color/platform_color_FFFFFF"/>
<LinearLayout
android:layout_width="0dp"
android:layout_weight="157"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/homeModuleAssuageGriefUnderFourItemViewSecondImg"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="88"
android:background="@drawable/home_module_image_default_back"/>
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:background="@color/platform_color_FFFFFF"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="88"
android:background="@color/baby_blue">
<ImageView
android:id="@+id/homeModuleAssuageGriefUnderFourItemViewThirdImg"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/home_module_image_default_back"/>
<TextView
android:id="@+id/homeModuleAssuageGriefUnderFourthItemViewTag"
android:layout_width="30dp"
android:layout_height="14dp"
android:gravity="center"
tools:text="9图"
android:textSize="@dimen/platform_dp_10"
android:textColor="@color/platform_color_242424"
android:background="@drawable/home_module_assuage_grief_item_view_image_num_back"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginRight="@dimen/platform_dp_5"
android:layout_marginBottom="@dimen/platform_dp_5"/>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</merge>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/homeModuleAssuageGriefUnderTwoItemViewImg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:background="@drawable/home_module_image_default_back"/>
</RelativeLayout>
</merge>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:id="@+id/homeModuleAssuageGriefViewChildLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/platform_dp_20"
android:paddingTop="@dimen/platform_dp_18"
android:paddingLeft="@dimen/platform_dp_15"
android:paddingRight="@dimen/platform_dp_15"
android:background="@drawable/home_module_view_shadow_bg">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/platform_dp_18">
<RelativeLayout
android:id="@+id/homeModuleAssuageGriefViewPersonCardView"
android:layout_width="38dp"
android:layout_height="38dp"
android:background="@drawable/home_module_assuage_grief_stroke_line">
<android.support.v7.widget.CardView
android:layout_width="@dimen/platform_dp_36"
android:layout_height="@dimen/platform_dp_36"
app:cardCornerRadius="@dimen/platform_dp_18"
app:cardElevation="0dp"
android:layout_centerInParent="true">
<ImageView
android:id="@+id/homeModuleAssuageGriefViewPersonImg"
android:layout_width="@dimen/platform_dp_36"
android:layout_height="@dimen/platform_dp_36"
android:src="@drawable/platform_icon_country"
android:scaleType="centerCrop"/>
</android.support.v7.widget.CardView>
</RelativeLayout>
<TextView
android:id="@+id/homeModuleAssuageGriefViewPersonName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Zoe Miller"
android:textSize="@dimen/platform_dp_14"
android:textColor="@color/platform_color_242424"
android:textStyle="bold"
android:gravity="center"
android:layout_alignTop="@+id/homeModuleAssuageGriefViewPersonCardView"
android:layout_alignBottom="@+id/homeModuleAssuageGriefViewPersonCardView"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/homeModuleAssuageGriefViewPersonCardView"
android:layout_marginLeft="@dimen/platform_dp_8"
/>
<TextView
android:id="@+id/homeModuleAssuageGriefViewTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="今天 15:05"
android:textSize="@dimen/platform_dp_12"
android:textColor="@color/platform_color_999999"
android:layout_toRightOf="@+id/homeModuleAssuageGriefViewPersonCardView"
android:layout_alignBottom="@+id/homeModuleAssuageGriefViewPersonCardView"
android:layout_marginLeft="@dimen/platform_dp_8"
android:layout_marginBottom="0.5dp"
android:visibility="gone"/>
<RelativeLayout
android:id="@+id/homeModuleAssuageGriefItemViewIsFollow"
android:layout_width="@dimen/platform_dp_60"
android:layout_height="@dimen/platform_dp_24"
android:layout_centerVertical="true"
android:layout_alignParentRight="true">
<ImageView
android:id="@+id/homeModuleAssuageGriefItemViewFollow"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/home_module_focus_en"
android:layout_centerInParent="true"/>
<ImageView
android:id="@+id/homeModuleAssuageGriefItemViewUnFollow"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/home_module_focus_un"
android:layout_centerInParent="true"/>
</RelativeLayout>
</RelativeLayout>
<!-- 标题,默认隐藏-->
<TextView
android:id="@+id/homeModuleAssuageGriefViewTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:maxLines="1"
android:ellipsize="end"
android:textColor="@color/platform_color_242424"
android:textSize="@dimen/platform_dp_18"
android:layout_marginBottom="@dimen/platform_dp_6"
android:textStyle="bold"
tools:text="可是除了你,没人能左右我的情绪可是除了你,没人能左右我的情绪"/>
<TextView
android:id="@+id/homeModuleAssuageGriefViewContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="3"
android:ellipsize="end"
android:lineSpacingExtra="@dimen/platform_dp_5"
tools:text="在我空闲的时间里,我想起了许久没有联系的露娜,给她打了一通电话。我没有说很多,可她还是感觉出了我的不对劲,竟然不顾雪夜寒冷与路途遥远,一个多钟在我空闲的时间里,我想起了许久没有联系的露娜,给她打了一通电话。我没有说很多,可她还是感觉出了我的不对劲,竟然不顾雪夜寒冷与路途遥远,一个多钟..."
android:textSize="@dimen/platform_dp_13"
android:textColor="@color/platform_color_666666"/>
<!-- 评论内容,默认隐藏-->
<RelativeLayout
android:id="@+id/homeModuleAssuageGriefViewComment"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/platform_dp_12"
android:layout_marginTop="@dimen/platform_dp_16"
android:background="@drawable/home_module_assuage_grief_item_view_tab_back">
<ImageView
android:id="@+id/homeModuleAssuageGriefViewHotView"
android:layout_height="@dimen/platform_dp_14"
android:layout_width="@dimen/platform_dp_28"
android:src="@drawable/home_module_comment_hot_icon"/>
<TextView
android:id="@+id/homeModuleAssuageGriefViewHotViewComment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/platform_dp_15"
android:layout_marginLeft="@dimen/platform_dp_15"
tools:text="劳蘸酱:"
android:textStyle="bold"
android:textSize="@dimen/platform_dp_13"
android:textColor="@color/platform_color_444444"
android:maxLines="2"
android:ellipsize="end"
android:layout_below="@+id/homeModuleAssuageGriefViewHotView"
android:layout_marginTop="@dimen/platform_dp_5"
/>
<TextView
android:id="@+id/homeModuleAssuageGriefViewHotViewCommentContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/platform_dp_15"
android:layout_marginLeft="@dimen/platform_dp_15"
android:lineSpacingExtra="@dimen/platform_dp_4"
tools:text="劳蘸酱:人生的旅途中,我们总是在不断的相遇和告别中前行。生活总会让我们经历着或多或少我们总是在不断的相遇和告别中前行我们总是在不断的相遇和告别中前行"
android:textSize="@dimen/platform_dp_13"
android:textColor="@color/platform_color_444444"
android:maxLines="2"
android:ellipsize="end"
android:layout_below="@+id/homeModuleAssuageGriefViewHotView"
android:layout_marginTop="@dimen/platform_dp_5"
/>
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="@dimen/platform_dp_20">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingLeft="@dimen/platform_dp_7"
android:paddingRight="@dimen/platform_dp_7"
android:paddingTop="@dimen/platform_dp_4"
android:paddingBottom="@dimen/platform_dp_4"
android:gravity="center_vertical"
android:background="@drawable/home_module_assuage_grief_item_view_tab_back">
<ImageView
android:layout_width="11.36dp"
android:layout_height="10.72dp"
android:src="@drawable/home_module_assuage_grief_item_view_tab_icon"/>
<TextView
android:id="@+id/homeModuleAssuageGriefViewTag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="情感倾诉"
android:textColor="@color/platform_color_242424"
android:textSize="@dimen/platform_dp_12"
android:layout_marginLeft="@dimen/platform_dp_3"/>
</LinearLayout>
<View
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="0dp"/>
<ImageView
android:layout_width="@dimen/platform_dp_18"
android:layout_height="@dimen/platform_dp_18"
android:src="@drawable/home_module_assuage_grief_item_view_tab_comment"/>
<TextView
android:id="@+id/homeModuleAssuageGriefViewCommentsCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="68"
android:textSize="@dimen/platform_dp_14"
android:textColor="@color/platform_color_242424"
android:layout_marginRight="@dimen/platform_dp_22"
android:layout_marginLeft="@dimen/platform_dp_5"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</LinearLayout>
<LinearLayout
android:id="@+id/ll_zan"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/homeModuleAssuageGriefViewZanState"
android:layout_width="@dimen/platform_dp_18"
android:layout_height="@dimen/platform_dp_18"
android:src="@drawable/home_module_assuage_grief_item_view_tab_warm"/>
<TextView
android:id="@+id/homeModuleAssuageGriefViewZanCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="987"
android:textSize="@dimen/platform_dp_14"
android:textColor="@color/platform_color_242424"
android:layout_marginLeft="@dimen/platform_dp_5"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.yidianling.home.ui.view.HomeCommonTitleView
android:id="@+id/homeModuleAssuageGriefViewHomeCommonTitleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</merge>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ll_home_module_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<com.yidianling.home.ui.widget.HomeModuleCategoryView
android:id="@+id/home_category_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<LinearLayout
android:layout_marginTop="8dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:gravity="center_horizontal"
android:orientation="horizontal"
android:paddingBottom="20dp"
>
<RelativeLayout
android:id="@+id/homeModuleButtonBannerFirst"
android:layout_width="0dp"
android:layout_height="78dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_weight="1"
android:background="@drawable/home_module_dcotor_bt_bg"
android:gravity="center"
>
<TextView
android:id="@+id/homeModuleButtonBannerFirstTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="预约咨询"
android:textColor="@color/platform_black"
android:textSize="@dimen/platform_dp_16"
android:textStyle="bold"/>
<TextView
android:layout_marginTop="2dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/homeModuleButtonBannerFirstTitle"
android:text="1W+师资"
android:textColor="@color/platform_color_444444"
android:textSize="@dimen/platform_dp_11"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/homeModuleButtonBannerSecond"
android:layout_width="0dp"
android:layout_height="78dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_weight="1"
android:background="@drawable/home_module_listen_bt_bg"
>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:paddingTop="1dp"
android:paddingBottom="1dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:background="@drawable/home_module_button_first_free_bg">
</RelativeLayout>
<LinearLayout
android:gravity="center_vertical"
android:layout_centerVertical="true"
android:orientation="vertical"
android:layout_gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_gravity="center"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_gravity="center"
android:id="@+id/homeModuleButtonBannerSecondTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="即时倾诉"
android:textColor="@color/platform_black"
android:textSize="@dimen/platform_dp_16"
android:textStyle="bold"/>
<TextView
android:layout_marginTop="2dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/homeModuleButtonBannerSecondTitle"
android:text="专业解忧"
android:textColor="@color/platform_color_444444"
android:layout_centerVertical="true"
android:textSize="@dimen/platform_dp_11"/>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
<RelativeLayout
android:id="@+id/homeModuleButtonBannerThird"
android:layout_width="0dp"
android:layout_height="78dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_weight="1"
android:background="@drawable/home_module_course_bt_bg"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/homeModuleButtonBannerThirdTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="心理课堂"
android:textColor="@color/platform_black"
android:textSize="@dimen/platform_dp_16"
android:textStyle="bold"/>
<TextView
android:layout_marginTop="2dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/homeModuleButtonBannerThirdTitle"
android:text="送28元礼包"
android:textColor="@color/platform_color_444444"
android:textSize="@dimen/platform_dp_11"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/homeModuleButtonBannerFourth"
android:layout_width="0dp"
android:layout_height="78dp"
android:layout_weight="1"
android:background="@drawable/home_module_test_bt_bg"
android:gravity="center"
>
<TextView
android:id="@+id/homeModuleButtonBannerFourthTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="心理测试"
android:textColor="@color/platform_black"
android:textSize="@dimen/platform_dp_16"
android:textStyle="bold"/>
<TextView
android:layout_marginTop="2dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/homeModuleButtonBannerFourthTitle"
android:text="专业权威"
android:textColor="@color/platform_color_444444"
android:textSize="@dimen/platform_dp_11"/>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:paddingTop="@dimen/platform_dp_24"
android:paddingBottom="@dimen/platform_dp_14">
<View
android:layout_width="0dp"
android:layout_height="5dp"
android:background="@drawable/home_module_common_title_gradient_back"
app:layout_constraintLeft_toLeftOf="@+id/homeModuleCommonTitleViewTitle"
app:layout_constraintRight_toRightOf="@+id/homeModuleCommonTitleViewTitle"
app:layout_constraintBottom_toBottomOf="@+id/homeModuleCommonTitleViewTitle"
android:layout_marginBottom="2dp"/>
<TextView
android:id="@+id/homeModuleCommonTitleViewTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="@dimen/platform_dp_1"
tools:text="通用.标题"
android:textSize="24dp"
android:textStyle="bold"
android:textColor="@color/platform_color_333333"
android:layout_marginLeft="@dimen/platform_dp_15"
app:layout_constraintLeft_toLeftOf="parent"/>
<LinearLayout
android:layout_width="66dp"
android:layout_height="@dimen/platform_dp_24"
android:orientation="horizontal"
android:gravity="center"
android:layout_marginBottom="@dimen/platform_dp_3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginRight="@dimen/platform_dp_15"
android:background="@drawable/home_module_show_more_line">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="更多"
android:layout_marginLeft="@dimen/platform_dp_2"
android:textColor="@color/platform_color_444444"
android:textSize="13sp"/>
<ImageView
android:layout_height="8dp"
android:layout_width="4dp"
android:src="@drawable/home_module_sale_arrow"
android:layout_marginLeft="3dp"/>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/img_head"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="15dp"
android:layout_marginTop="21dp"
android:scaleType="fitXY"
android:src="@drawable/platform_head_place_hold_pic"/>
<ImageView
android:id="@+id/iv_confide_voice"
android:layout_alignBottom="@id/img_head"
android:layout_alignRight="@id/img_head"
android:layout_width="22dp"
android:layout_height="22dp"
android:src="@drawable/anim_confilde_play"
android:layout_alignEnd="@id/img_head"/>
<TextView
android:id="@+id/tv_confide"
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_alignTop="@+id/img_head"
android:layout_alignParentEnd="true"
android:layout_marginTop="@dimen/platform_dp_13"
android:layout_marginEnd="@dimen/platform_dp_15"
android:gravity="center"
android:background="@drawable/home_module_confide_line_1"
/>
<LinearLayout
android:id="@+id/tv_name_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/img_head"
android:layout_marginStart="16dp"
android:layout_marginTop="-2dp"
android:layout_toEndOf="@+id/img_head"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/platform_color_242424"
android:textSize="@dimen/platform_dp_16"
android:textStyle="bold"
tools:ignore="SpUsage"
tools:text="姚雨晴"/>
<ImageView
android:id="@+id/img_sex"
android:layout_width="13dp"
android:layout_height="13dp"
android:layout_marginStart="6dp"
android:layout_marginLeft="3dp"
android:background="@drawable/home_module_counselor"/>
</LinearLayout>
<com.ydl.ydlcommon.view.TagView
android:id="@+id/tag_view"
android:layout_width="match_parent"
android:layout_height="@dimen/platform_dp_16"
android:layout_below="@+id/tv_name_layout"
android:layout_marginStart="@dimen/platform_dp_16"
android:layout_marginTop="6dp"
android:layout_marginEnd="@dimen/platform_dp_10"
android:layout_toLeftOf="@+id/tv_confide"
android:layout_toEndOf="@+id/img_head"
android:orientation="horizontal"/>
<TextView
android:id="@+id/tv_confideNum"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tag_view"
android:layout_marginStart="@dimen/platform_dp_16"
android:layout_marginTop="5dp"
android:layout_toEndOf="@+id/img_head"
android:textColor="@color/platform_color_242424"
android:textSize="@dimen/platform_dp_12"
android:textStyle="bold"
tools:ignore="SpUsage"
tools:text="8000"/>
<TextView
android:id="@+id/tv_tv_confideNumContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tag_view"
android:layout_marginTop="8dp"
android:layout_marginEnd="@dimen/platform_dp_12"
android:layout_toEndOf="@+id/tv_confideNum"
android:text="人向TA倾诉"
android:textColor="@color/platform_color_666666"
android:textSize="10sp"
tools:ignore="SpUsage"/>
<TextView
android:id="@+id/tv_Connection"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tag_view"
android:layout_marginTop="5dp"
android:layout_toEndOf="@+id/tv_tv_confideNumContent"
android:textColor="@color/platform_color_242424"
android:textSize="@dimen/platform_dp_12"
android:textStyle="bold"
tools:ignore="SpUsage"
tools:text="83%"/>
<TextView
android:id="@+id/tv_ConnectionContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tag_view"
android:layout_marginTop="8dp"
android:layout_marginEnd="@dimen/platform_dp_12"
android:layout_toEndOf="@+id/tv_Connection"
android:text="接通率"
android:textColor="@color/platform_color_666666"
android:textSize="10sp"
tools:ignore="SpUsage"/>
<TextView
android:id="@+id/tv_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_confideNum"
android:layout_marginStart="@dimen/platform_dp_16"
android:layout_marginTop="7dp"
android:layout_marginBottom="18dp"
android:layout_toEndOf="@+id/img_head"
android:gravity="bottom"
android:textColor="#FF5A4C"
android:textSize="@dimen/platform_dp_16"
android:textStyle="bold"
tools:ignore="SpUsage"
tools:text="¥199"/>
<TextView
android:id="@+id/tv_price_tips"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/tv_price"
android:layout_marginLeft="2dp"
android:layout_marginBottom="2dp"
android:layout_toRightOf="@+id/tv_price"
android:gravity="center"
android:text="起"
android:textColor="@color/platform_color_666666"
android:textSize="@dimen/platform_dp_12"/>
<TextView
android:id="@+id/tvOriginalPrice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/tv_price"
android:layout_alignBottom="@+id/tv_price"
android:layout_marginStart="@dimen/platform_dp_6"
android:layout_marginBottom="-1dp"
android:layout_toEndOf="@+id/tv_price_tips"
android:gravity="center"
android:textColor="@color/platform_color_666666"
android:textSize="@dimen/platform_dp_12"
tools:ignore="SpUsage"
tools:text="原价¥50"/>
<TextView
android:id="@+id/tvCoupon"
android:layout_width="wrap_content"
android:layout_height="@dimen/platform_dp_15"
android:layout_alignTop="@+id/tv_price"
android:layout_alignBottom="@+id/tv_price"
android:layout_marginLeft="12dp"
android:layout_marginTop="3dp"
android:layout_marginBottom="2dp"
android:layout_toRightOf="@+id/tvOriginalPrice"
android:background="@drawable/home_module_confide_expert_info_coupon_background"
android:gravity="center"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:textColor="@color/platform_color_FF5A4C"
android:textSize="@dimen/platform_dp_10"
android:textStyle="bold"
tools:ignore="SpUsage"
tools:text="立减¥30"/>
<View
android:id="@+id/view_line"
style="@style/platform_viewline"
android:layout_below="@+id/tv_price"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:background="@color/platform_color_EBEBEB"/>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.yidianling.home.ui.view.HomeCommonTitleView
android:id="@+id/homeModuleConfideViewHomeCommonTitleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center_vertical"
android:orientation="horizontal"
>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="1">
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="40dp"
app:tabGravity="fill"
app:tabIndicatorHeight="0dp"
app:tabMode="scrollable"
app:tabSelectedTextColor="@color/platform_color_242424"
app:tabTextAppearance="@style/TabLayoutTextSize"
app:tabTextColor="#333"/>
<View
android:layout_alignParentRight="true"
android:background="@drawable/home_module_consult_head_border"
android:layout_width="20dp"
android:layout_height="match_parent"/>
</RelativeLayout>
<ImageView
android:layout_width="5dp"
android:layout_height="10dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:src="@drawable/home_module_sale_arrow"/>
</LinearLayout>
<LinearLayout
android:id="@+id/ll_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"/>
</merge>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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="wrap_content"
android:layout_marginLeft="@dimen/platform_dp_15"
android:layout_marginRight="@dimen/platform_dp_15"
android:layout_marginBottom="@dimen/platform_dp_15"
android:background="@drawable/home_module_view_shadow_bg"
android:padding="@dimen/platform_dp_15"
>
<RelativeLayout
android:layout_centerVertical="true"
android:id="@+id/rl_consult_head"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<View
android:layout_width="103dp"
android:layout_height="105dp"
android:background="@drawable/home_module_consult_head_border"
/>
<android.support.v7.widget.CardView
android:layout_width="102dp"
android:layout_height="104dp"
android:layout_centerInParent="true"
app:cardCornerRadius="@dimen/platform_dp_4"
app:cardElevation="1dp">
<ImageView
android:id="@+id/img_consult_head"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"/>
</android.support.v7.widget.CardView>
</RelativeLayout>
<LinearLayout
android:id="@+id/tv_name_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/rl_consult_head"
android:layout_marginStart="16dp"
android:layout_toEndOf="@+id/rl_consult_head"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_consult_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/platform_color_242424"
android:textSize="@dimen/platform_dp_16"
android:textStyle="bold"
tools:ignore="SpUsage"
tools:text="姚雨晴"/>
<ImageView
android:id="@+id/img_sex"
android:layout_width="13dp"
android:layout_height="13dp"
android:layout_marginStart="6dp"
android:layout_marginLeft="3dp"
android:background="@drawable/home_module_counselor"/>
</LinearLayout>
<com.ydl.ydlcommon.view.TagView
android:id="@+id/tag_view"
android:layout_width="match_parent"
android:layout_height="@dimen/platform_dp_16"
android:layout_below="@+id/tv_name_layout"
android:layout_marginStart="@dimen/platform_dp_16"
android:layout_marginTop="6dp"
android:layout_marginEnd="@dimen/platform_dp_10"
android:layout_toEndOf="@+id/rl_consult_head"
android:orientation="horizontal"/>
<TextView
android:id="@+id/tv_tv_consult_num_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tag_view"
android:layout_alignLeft="@+id/tv_name_layout"
android:layout_marginTop="8dp"
android:text="咨询次数 "
android:textColor="@color/platform_color_666666"
android:textSize="10sp"
tools:ignore="SpUsage"/>
<TextView
android:id="@+id/tv_consult_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tag_view"
android:layout_marginTop="5dp"
android:layout_toRightOf="@+id/tv_tv_consult_num_content"
android:textColor="@color/platform_color_242424"
android:textSize="@dimen/platform_dp_12"
android:textStyle="bold"
tools:ignore="SpUsage"
tools:text="8000"/>
<TextView
android:id="@+id/tv_feedback_rate_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tag_view"
android:layout_toRightOf="@+id/tv_consult_num"
android:layout_marginTop="8dp"
android:layout_marginLeft="12dp"
android:text="好评率 "
android:textColor="@color/platform_color_666666"
android:textSize="10sp"
tools:ignore="SpUsage"
/>
<TextView
android:id="@+id/tv_feedback_rate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tag_view"
android:layout_toRightOf="@+id/tv_feedback_rate_content"
android:layout_marginTop="5dp"
android:textColor="@color/platform_color_242424"
android:textSize="12sp"
android:textStyle="bold"
tools:ignore="SpUsage"
tools:text="83%"/>
<TextView
android:id="@+id/tv_consult_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_consult_num"
android:layout_marginStart="@dimen/platform_dp_16"
android:layout_marginTop="7dp"
android:layout_toEndOf="@+id/rl_consult_head"
android:layout_alignBottom="@+id/rl_consult_head"
android:gravity="bottom"
android:textColor="#FF5A4C"
android:textSize="@dimen/platform_dp_16"
android:textStyle="bold"
tools:ignore="SpUsage"
tools:text="¥199"
android:layout_marginBottom="2dp"
/>
<TextView
android:id="@+id/tv_price_tips"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/tv_consult_price"
android:layout_marginLeft="2dp"
android:layout_marginBottom="2dp"
android:layout_toRightOf="@+id/tv_consult_price"
android:gravity="center"
android:text="起"
android:textColor="@color/platform_color_666666"
android:textSize="@dimen/platform_dp_12"/>
<TextView
android:id="@+id/tv_consult_chat"
android:layout_width="wrap_content"
android:layout_height="@dimen/platform_dp_22"
android:layout_alignBottom="@+id/tv_consult_price"
android:layout_alignParentRight="true"
android:background="@drawable/home_module_consult_chat_bg"
android:gravity="center"
android:paddingLeft="17dp"
android:paddingTop="3dp"
android:paddingRight="17dp"
android:paddingBottom="3dp"
android:text="私聊"
android:textColor="@color/platform_color_222222"
android:textSize="12sp"
android:textStyle="bold"/>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="@dimen/platform_dp_99"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_marginLeft="@dimen/platform_dp_15"
android:layout_marginRight="@dimen/platform_dp_15"
android:layout_marginBottom="@dimen/platform_dp_13"
android:layout_marginTop="@dimen/platform_dp_3"
android:padding="@dimen/platform_dp_15"
android:background="@drawable/home_module_view_shadow_bg">
<android.support.v7.widget.CardView
android:id="@+id/homeModuleCourseItemViewImgCardView"
android:layout_width="127dp"
android:layout_height="69dp"
app:cardCornerRadius="6dp"
app:cardElevation="0dp">
<ImageView
android:id="@+id/homeModuleCourseItemViewImg"
android:layout_width="127dp"
android:layout_height="69dp"
android:scaleType="centerCrop"
android:src="@drawable/home_module_image_default_back"/>
</android.support.v7.widget.CardView>
<TextView
android:id="@+id/homeModuleCourseItemViewTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/homeModuleCourseItemViewImgCardView"
android:layout_marginLeft="@dimen/platform_dp_12"
android:textSize="@dimen/platform_dp_16"
android:textColor="@color/platform_color_242424"
android:textStyle="bold"
android:maxLines="2"
android:ellipsize="end"
android:layout_marginTop="-2dp"
tools:text="深度睡眠速效药丸丨帮你
像婴儿般安稳入睡深度睡眠速效药丸丨帮你
像婴儿般安稳入睡"/>
<TextView
android:id="@+id/homeModuleCourseItemViewFreePrice"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="免费"
android:textSize="@dimen/platform_dp_15"
android:textStyle="bold"
android:textColor="@color/platform_color_34CD65"
android:layout_alignBottom="@+id/homeModuleCourseItemViewImgCardView"
android:layout_toRightOf="@+id/homeModuleCourseItemViewImgCardView"
android:layout_marginLeft="@dimen/platform_dp_12"/>
<RelativeLayout
android:id="@+id/homeModuleCourseItemViewExpensePriceHideView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/homeModuleCourseItemViewImgCardView"
android:layout_toRightOf="@+id/homeModuleCourseItemViewImgCardView"
android:layout_marginLeft="@dimen/platform_dp_12"
android:layout_marginBottom="-2dp">
<TextView
android:id="@+id/homeModuleCourseItemViewExpensePrice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="¥688"
android:textStyle="bold"
android:textSize="16dp"
android:textColor="@color/platform_color_FF5A4C"/>
</RelativeLayout>
<TextView
android:id="@+id/homeModuleCourseItemViewPersonText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="人气"
android:textSize="@dimen/platform_dp_11"
android:gravity="center"
android:textColor="@color/platform_color_666666"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/homeModuleCourseItemViewExpensePriceHideView"
android:layout_alignBottom="@+id/homeModuleCourseItemViewExpensePriceHideView"
android:layout_marginBottom="-1dp"
/>
<TextView
android:id="@+id/homeModuleCourseItemViewPersonNum"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="3109"
android:textSize="@dimen/platform_dp_12"
android:textColor="@color/platform_color_242424"
android:layout_toLeftOf="@+id/homeModuleCourseItemViewPersonText"
android:layout_alignBottom="@+id/homeModuleCourseItemViewExpensePriceHideView"
android:layout_alignTop="@+id/homeModuleCourseItemViewExpensePriceHideView"
android:gravity="center"
android:layout_marginBottom="-1dp"
android:textStyle="bold"
/>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.yidianling.home.ui.view.HomeCommonTitleView
android:id="@+id/homeModuleCourseViewHomeCommonTitleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</merge>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingTop="@dimen/platform_dp_30"
android:paddingBottom="@dimen/platform_dp_16">
<View
android:layout_width="48dp"
android:layout_height="0.5dp"
android:background="@color/platform_color_EBEBEB"
android:layout_marginRight="@dimen/platform_dp_8"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/platform_color_999999"
android:textSize="@dimen/platform_dp_10"
android:text="我是有底线的"/>
<View
android:layout_width="48dp"
android:layout_height="0.5dp"
android:layout_marginLeft="@dimen/platform_dp_8"
android:background="@color/platform_color_EBEBEB"/>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:gravity="center_vertical"
android:paddingLeft="@dimen/platform_dp_15"
android:paddingRight="@dimen/platform_dp_15"
android:paddingTop="@dimen/platform_dp_8"
android:paddingBottom="@dimen/platform_dp_8">
<ImageView
android:id="@+id/iv_fm_play"
android:layout_height="@dimen/platform_dp_22"
android:layout_width="@dimen/platform_dp_22"
android:src="@drawable/home_module_intelligent_item_play_icon"
android:layout_marginRight="@dimen/platform_dp_7"/>
<TextView
android:id="@+id/homeModuleIntelligentItemViewTitle"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
tools:text="2018倒计时,这一年你过2018倒计时,这一年你过的…"
android:textSize="@dimen/platform_dp_16"
android:textColor="@color/platform_color_242424"
android:textStyle="bold"
android:layout_marginRight="@dimen/platform_dp_29"
android:maxLines="1"
android:ellipsize="end"/>
<TextView
android:id="@+id/homeModuleIntelligentItemViewHits"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="3785"
android:textSize="@dimen/platform_dp_12"
android:textColor="@color/platform_color_666666"
android:maxLines="1"
android:ellipsize="end"/>
<ImageView
android:layout_height="@dimen/platform_dp_11"
android:layout_width="@dimen/platform_dp_12"
android:src="@drawable/home_module_intelligent_item_listen_icon"
android:layout_marginLeft="@dimen/platform_dp_4"/>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<android.support.v7.widget.CardView
android:id="@+id/homeModuleIntelligentTopViewImageCardView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cardCornerRadius="@dimen/platform_dp_7"
app:cardElevation="0dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/homeModuleIntelligentTopViewImage"
android:background="@drawable/home_module_image_default_back"
android:scaleType="centerCrop"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="45"/>
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="55"
android:background="@drawable/home_module_intelligent_gradient_back"/>
</LinearLayout>
</RelativeLayout>
</android.support.v7.widget.CardView>
<TextView
android:id="@+id/homeModuleIntelligentTopViewTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="先结婚还是先买先结婚还是先买房"
android:textSize="@dimen/platform_dp_24"
android:textColor="@color/platform_color_FFFFFF"
android:textStyle="bold"
android:maxLines="1"
android:ellipsize="end"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_marginLeft="@dimen/platform_dp_14"
android:layout_marginBottom="@dimen/platform_dp_35"
android:layout_marginRight="@dimen/platform_dp_115"
/>
<LinearLayout
android:id="@+id/homeModuleIntelligentTopViewDescLayout"
android:layout_width="wrap_content"
android:layout_height="@dimen/platform_dp_18"
android:orientation="horizontal"
android:gravity="center_vertical"
android:paddingLeft="@dimen/platform_dp_10"
android:paddingRight="@dimen/platform_dp_10"
android:background="@drawable/home_module_intelligent_top_view_layout_back"
android:layout_alignLeft="@+id/homeModuleIntelligentTopViewTitle"
android:layout_alignParentBottom="true"
android:layout_marginBottom="@dimen/platform_dp_14">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="主播/"
android:textColor="@color/platform_color_222222"
android:textSize="@dimen/platform_dp_12"
/>
<TextView
android:id="@+id/homeModuleIntelligentTopViewAuthor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="花心月"
android:textColor="@color/platform_color_222222"
android:textSize="@dimen/platform_dp_12"
android:layout_marginBottom="0.5dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="收听/"
android:textColor="@color/platform_color_222222"
android:textSize="@dimen/platform_dp_12"
android:layout_marginLeft="@dimen/platform_dp_12"
/>
<TextView
android:id="@+id/homeModuleIntelligentTopViewHits"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="2486"
android:textColor="@color/platform_color_222222"
android:textSize="@dimen/platform_dp_13"
android:layout_marginBottom="1dp"
/>
</LinearLayout>
<ImageView
android:id="@+id/iv_play_fm"
android:layout_width="@dimen/platform_dp_36"
android:layout_height="@dimen/platform_dp_36"
android:src="@drawable/home_module_intelligent_first_play_icon"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="@dimen/platform_dp_14"
android:layout_marginBottom="16.5dp"/>
<RelativeLayout
android:layout_width="@dimen/platform_dp_64"
android:layout_height="@dimen/platform_dp_20"
android:layout_alignParentRight="true"
android:background="@drawable/home_module_intelligent_top_view_recommend_back">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="每日推荐"
android:textColor="@color/platform_color_242424"
android:textSize="@dimen/platform_dp_12"
android:textStyle="bold"/>
</RelativeLayout>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<com.yidianling.home.ui.view.HomeCommonTitleView
android:id="@+id/homeModuleIntelligentViewHomeCommonTitleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/homeModuleIntelligentViewAddLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/platform_dp_15"
android:layout_marginRight="@dimen/platform_dp_15"
android:layout_marginTop="@dimen/platform_dp_2"
android:layout_marginBottom="@dimen/platform_dp_20"
android:background="@drawable/home_module_card_view_stroke"
android:orientation="vertical"></LinearLayout>
</merge>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<FrameLayout
android:id="@+id/homeModulePagerBannerFlRoot"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/platform_white"
android:paddingLeft="15dp"
android:paddingRight="15dp"
/>
</merge>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="180dp"
>
<com.ydl.ydlcommon.view.banner.Banner
android:id="@+id/homeModulePagerBannerViewBanner"
android:layout_width="match_parent"
android:layout_height="180dp"
app:pa_indicator_different_width="14dp"
app:pa_indicator_drawable_selected="@drawable/home_module_banner_tip_select"
app:pa_indicator_drawable_unselected="@drawable/home_module_banner_tip_unselect"
app:pa_indicator_height="5dp"
app:pa_indicator_margin="1.25dp"
app:pa_is_selected_same_unselected="false"
android:background="@color/platform_color_444444"
/>
<ImageView
android:layout_alignBottom="@+id/homeModulePagerBannerViewBanner"
android:layout_width="match_parent"
android:layout_height="15dp"
android:background="@drawable/home_module_arc_bg"/>
</RelativeLayout>
</merge>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center">
<ImageView
android:id="@+id/homeModulePagerBannerViewGridViewItemImage"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@drawable/platform_icon_country"/>
<TextView
android:id="@+id/homeModulePagerBannerViewGridViewItemText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/platform_dp_13"
android:textColor="@color/platform_color_242424"
tools:text="恋爱咨询"/>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="?android:attr/selectableItemBackground"
xmlns:tools="http://schemas.android.com/tools">
<TextView
android:layout_gravity="center_vertical"
tools:text="刚刚 姚**预约了"
android:layout_marginLeft="15dp"
android:id="@+id/tv_in_content_before"
android:textColor="#999"
android:textSize="12dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_marginLeft="3dp"
android:layout_marginRight="3dp"
android:layout_gravity="center_vertical"
tools:text="周艳玲"
android:id="@+id/tv_in_doctor_name"
android:textSize="12dp"
android:textColor="#0CACF4"
android:lines="1"
android:ellipsize="end"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_in_content_after"
android:layout_gravity="center_vertical"
tools:text="老师的电话倾诉"
android:textColor="#999"
android:textSize="12dp"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="10dp"
android:paddingBottom="10dp"
>
<ImageView
android:layout_width="60dp"
android:layout_height="18dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="15dp"
android:scaleType="centerCrop"
android:src="@drawable/home_module_near_icon"/>
<FrameLayout
android:id="@+id/homeModuleRealViewLeftFrameLayout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<ImageView
android:layout_width="4dp"
android:layout_height="8dp"
android:layout_gravity="center_vertical"
android:layout_marginRight="15dp"
android:background="@drawable/home_module_sale_arrow"
/>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="?android:attr/selectableItemBackground"
xmlns:tools="http://schemas.android.com/tools">
<TextView
android:layout_gravity="center_vertical"
tools:text="刚刚 姚**预约了"
android:layout_marginLeft="15dp"
android:id="@+id/tv_out_content_before"
android:textColor="#999"
android:textSize="12dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_gravity="center_vertical"
tools:text="周艳玲"
android:layout_marginLeft="6dp"
android:id="@+id/tv_out_doctor_name"
android:textSize="12dp"
android:textColor="#0CACF4"
android:lines="1"
android:ellipsize="end"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_out_content_after"
android:layout_gravity="center_vertical"
tools:text="老师的电话倾诉"
android:layout_marginLeft="6dp"
android:textColor="#999"
android:textSize="12dp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingTop="@dimen/platform_dp_8"
android:paddingBottom="@dimen/platform_dp_8"
>
<android.support.v7.widget.CardView
android:layout_width="70dp"
android:layout_height="50dp"
app:cardCornerRadius="@dimen/platform_dp_6"
app:cardElevation="0dp">
<ImageView
android:id="@+id/iv_test_item"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/home_module_image_default_back"
android:scaleType="centerCrop"/>
</android.support.v7.widget.CardView>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_test_item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/platform_color_242424"
android:textSize="@dimen/platform_dp_16"
android:textStyle="bold"
tools:text="2018倒计时,这一年你过2018倒计时,这一年你过的…"/>
<LinearLayout
android:id="@+id/homeModuleIntelligentTopViewDescLayout"
android:layout_width="wrap_content"
android:layout_height="@dimen/platform_dp_18"
android:layout_marginTop="8dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingRight="@dimen/platform_dp_10">
<TextView
android:id="@+id/tv_test_item_hit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/platform_color_444444"
android:textSize="@dimen/platform_dp_12"
android:textStyle="bold"
tools:text="999"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="人气"
android:textColor="@color/platform_color_666666"
android:textSize="@dimen/platform_dp_12"
/>
<TextView
android:id="@+id/tv_tested_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/platform_dp_12"
android:textColor="@color/platform_color_444444"
android:textSize="@dimen/platform_dp_12"
android:textStyle="bold"
tools:text="2486"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="人已测"
android:textColor="@color/platform_color_666666"
android:textSize="@dimen/platform_dp_12"
/>
</LinearLayout>
</LinearLayout>
<TextView
android:layout_width="@dimen/platform_dp_32"
android:layout_height="@dimen/platform_dp_32"
android:background="@drawable/home_module_test_item_go_bg"
android:gravity="center"
android:text="GO"
android:textSize="13sp"
android:textColor="@color/platform_color_222222"
android:textStyle="bold"/>
</LinearLayout>
<View
android:visibility="gone"
android:layout_marginBottom="@dimen/platform_dp_12"
android:id="@+id/view_test_line"
style="@style/viewline"
android:layout_marginLeft="82dp"
android:background="@color/platform_color_EBEBEB"/>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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.support.v7.widget.CardView
android:id="@+id/homeModuleIntelligentTopViewImageCardView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cardCornerRadius="@dimen/platform_dp_7"
app:cardElevation="0dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/homeModuleIntelligentTopViewImage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/home_module_image_default_back"
android:scaleType="centerCrop"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="45"/>
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="55"
android:background="@drawable/home_module_intelligent_gradient_back"/>
</LinearLayout>
</RelativeLayout>
</android.support.v7.widget.CardView>
<TextView
android:id="@+id/homeModuleIntelligentTopViewTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_marginLeft="@dimen/platform_dp_14"
android:layout_marginRight="@dimen/platform_dp_115"
android:layout_marginBottom="@dimen/platform_dp_35"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/platform_color_FFFFFF"
android:textSize="@dimen/platform_dp_24"
android:textStyle="bold"
tools:text="先结婚还是先买先结婚还是先买房"
/>
<LinearLayout
android:id="@+id/homeModuleIntelligentTopViewDescLayout"
android:layout_width="wrap_content"
android:layout_height="@dimen/platform_dp_18"
android:layout_alignLeft="@+id/homeModuleIntelligentTopViewTitle"
android:layout_alignParentBottom="true"
android:layout_marginBottom="@dimen/platform_dp_14"
android:background="@drawable/home_module_test_top_view_layout_back"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="@dimen/platform_dp_10"
android:paddingRight="@dimen/platform_dp_10">
<TextView
android:id="@+id/homeModuleIntelligentTopViewAuthor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/platform_color_444444"
android:textSize="@dimen/platform_dp_12"
android:textStyle="bold"
tools:text="999"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="人气"
android:textColor="@color/platform_color_666666"
android:textSize="@dimen/platform_dp_12"
/>
<TextView
android:id="@+id/homeModuleIntelligentTopViewHits"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/platform_dp_12"
android:textColor="@color/platform_color_444444"
android:textSize="@dimen/platform_dp_12"
android:textStyle="bold"
tools:text="2486"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="已测"
android:textColor="@color/platform_color_666666"
android:textSize="@dimen/platform_dp_12"
/>
</LinearLayout>
<RelativeLayout
android:layout_width="@dimen/platform_dp_64"
android:layout_height="@dimen/platform_dp_20"
android:layout_alignParentRight="true"
android:background="@drawable/home_module_intelligent_top_view_recommend_back">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="每日一测"
android:textColor="@color/platform_color_242424"
android:textSize="@dimen/platform_dp_12"
android:textStyle="bold"/>
</RelativeLayout>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<com.yidianling.home.ui.view.HomeCommonTitleView
android:id="@+id/homeModuleIntelligentViewHomeCommonTitleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/homeModuleIntelligentViewAddLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/platform_dp_15"
android:layout_marginRight="@dimen/platform_dp_15"
android:layout_marginTop="@dimen/platform_dp_2"
android:orientation="vertical"/>
</merge>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v7.widget.RecyclerView
android:id="@+id/home_module_fragment_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/platform_white"/>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<com.yidianling.home.ui.scrollView.DisInterceptNestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/search_head_bg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="false"
android:clipToPadding="false"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.8">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<com.ydl.ydlcommon.view.banner.Banner
android:id="@+id/banner_search"
android:layout_width="match_parent"
android:layout_height="@dimen/head_bg_height"
app:pa_indicator_different_width="14dp"
app:pa_indicator_drawable_selected="@drawable/home_module_banner_tip_select"
app:pa_indicator_drawable_unselected="@drawable/home_module_banner_tip_unselect"
app:pa_indicator_height="5dp"
app:pa_indicator_margin="1.25dp"
app:pa_is_selected_same_unselected="false"
android:scaleType="centerCrop"
android:tag="overScroll"
/>
<ImageView
android:layout_alignBottom="@+id/banner_search"
android:layout_width="match_parent"
android:layout_height="16dp"
android:background="@drawable/home_module_arc_bg"/>
</RelativeLayout>
</com.yidianling.home.ui.scrollView.DisInterceptNestedScrollView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<com.yidianling.home.ui.scrollView.DisInterceptNestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/middle_but_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/head_bg_height"
android:background="@color/colorBg"
android:tag="middle_but_layout"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.13">
<!--删除分类控件 by: haorui -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:background="@color/platform_white"
android:layout_width="match_parent"
android:layout_height="44dp"/>
</RelativeLayout>
<!--<com.yidianling.home.ui.widget.HomeModuleCategoryView-->
<!--android:id="@+id/home_category_view"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="wrap_content"-->
<!--/>-->
</com.yidianling.home.ui.scrollView.DisInterceptNestedScrollView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/ll_search"
android:layout_width="match_parent"
android:layout_height="35dp"
android:layout_marginLeft="35dp"
android:layout_marginRight="35dp"
android:tag="tag_search_input"
app:layout_anchor="@+id/middle_but_layout"
app:layout_anchorGravity="top"
android:focusable="true"
android:orientation="horizontal"
android:focusableInTouchMode="true"
>
<ImageView
android:id="@+id/img_ad"
android:layout_width="64dp"
android:layout_height="34dp"
android:layout_marginEnd="10dp"
android:visibility="gone" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:id="@+id/view_search_input_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_home_module_input"
android:tag="tag_search_input_bg"
/>
<ImageView
android:id="@+id/iv_search_icon"
android:layout_marginLeft="15dp"
android:layout_marginRight="10dp"
android:layout_width="14dp"
android:layout_height="14dp"
android:scaleType="centerCrop"
android:layout_centerVertical="true"
android:tag="tag_search_input_img"
android:src="@drawable/home_module_search"/>
<EditText
android:editable="false"
android:id="@+id/etSearch"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="@dimen/platform_dp_10"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/iv_search_icon"
android:background="@null"
android:focusable="true"
android:focusableInTouchMode="true"
android:hint="搜索专家姓名"
android:imeOptions="actionSearch"
android:singleLine="true"
android:textColor="@color/platform_color_444444"
android:textColorHint="#999999"
android:textCursorDrawable="@color/color_0CACF4"
android:tag="tag_search_input_edit"
android:textSize="12sp"
/>
</RelativeLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/title_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:orientation="vertical"
app:layout_collapseMode="pin">
<View
android:id="@+id/view_search_toolbar_bg"
android:layout_width="match_parent"
android:layout_height="@dimen/home_title_bar_height"
android:background="#FFDD33"
android:tag="toolbar_bg"
/>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="home_module_category_view_test_line">#F0F0F0</color>
<color name="colorBg">#f5f5f5</color>
<color name="color_0CACF4">#0CACF4</color>
</resources>
\ No newline at end of file
<resources>
<dimen name="dp_60">60dp</dimen>
<dimen name="home_title_bar_height">48dp</dimen>
<dimen name="bg_height">300dp</dimen>
<dimen name="text_margin">16dp</dimen>
<dimen name="head_bg_height">180dp</dimen>
<dimen name="search_input_margin">160dp</dimen>
<!--分割线粗细-->
<dimen name="home_card_corner_radius">10dp</dimen>
<dimen name="home_card_elevation">2dp</dimen>
</resources>
<resources>
<string name="app_name">home-module</string>
<string name="home_module_real_test_just">刚刚</string>
<string name="home_module_real_test">测试了</string>
<string name="home_module_real_appoint">预约了</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--设置Tablayout字体大小-->
<style name="TabLayoutTextSize">
<item name="android:textSize">15sp</item>
</style>
<!--设置Tablayout字体加粗-->
<style name="TabLayoutTextStyle">
<item name="android:textStyle">bold</item>
<item name="android:textSize">17sp</item>
</style>
<style name="activityDialog" parent="NoTitleTheme">
<item name="android:windowIsTranslucent">true</item>
</style>
</resources>
\ No newline at end of file
......@@ -5,7 +5,7 @@ import android.support.v4.view.PagerAdapter
import android.util.Log
import android.view.View
import android.view.ViewGroup
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeHeaderBean
import com.yidianling.home.ui.view.HomeCategoryContainer
import com.yidianling.home.ui.view.HomePagerBannerCategoryItemView
......@@ -22,7 +22,7 @@ import kotlin.collections.ArrayList
class HomeCategoryAdapter : PagerAdapter{
private var mContext : Context? = null
private var mHomeEvent : IHomeEvent? = null
private var mHomeEvent : IHomeBaseEvent? = null
//源数据
private var mOriginList : MutableList<HomeHeaderBean.AskCategoryDataBean>? = null
//数据
......@@ -32,7 +32,7 @@ class HomeCategoryAdapter : PagerAdapter{
list = ArrayList()
}
constructor(context: Context,homeEvent : IHomeEvent?) : super(){
constructor(context: Context,homeEvent : IHomeBaseEvent?) : super(){
mContext = context
mHomeEvent = homeEvent
}
......
......@@ -7,6 +7,8 @@ import android.view.View
import android.view.ViewGroup
import com.yidianling.home.R
import com.yidianling.home.constract.YdlHomeViewHolderConstract
import com.yidianling.home.event.HomeImpl
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.model.bean.*
import com.yidianling.home.ui.view.*
......@@ -19,7 +21,7 @@ import com.yidianling.home.ui.view.*
* @date 2019/02/13
*/
class YdlHomeAdapter(private val mContext: Context,
private var homeEvent: IHomeEvent,
private var homeEvent: HomeImpl,
private var list: ArrayList<HomePagerDataBean>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val mInflater: LayoutInflater = LayoutInflater.from(mContext)
......
package com.yidianling.home.constract
import com.ydl.ydlcommon.mvp.base.IView
import com.yidianling.home.model.bean.*
import com.yidianling.home.constants.IHomeBaseContract
import com.yidianling.home.model.bean.MuseModuleBean
import io.reactivex.Observable
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 壹点灵首页约束类
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
class IHomeContract {
interface View : IView {
/**
* 首页数据回调接口
*/
fun homeDataResponse(list: MutableList<HomePagerDataBean>)
/**
* 头部数据回调
*/
fun homeHeadResponse(homeHeaderBean: HomeHeaderBean)
/**
* 首页数据请求失败接口
*/
fun homeDataFail(msg: String)
/**
* 获取倾述数据回调
*/
fun confideDataResponse(data: HomeConfideBean, selectPosition: Int)
/**
* 获取咨询数据回调
*/
fun consultDataResponse(data: HomeConsultBean, selectPosition: Int)
/**
* 问答模块数据回调
*/
fun askDataResponse(data: HomeAskBean, position: Int)
/**
* 首页问答 - 点赞
*/
fun askZan(position: Int, index: Int, id: String)
/**
* 首页问答 - 关注
*/
fun askFocus(position: Int, id: String)
/**
* 获取倾述列表数据
* @param type 倾述类型
* @param selectPosition 选中的position
*/
fun getConfideData(type: String, selectPosition: Int)
/**
* 获取咨询列表数据
*/
fun getConsultData(type: String, selectPosition: Int)
fun showHomeProgress()
fun showRefreshLayout()
fun dismissHomeProgress()
interface View : IHomeBaseContract.View {
fun startAnim()
fun endAnim()
fun resetModuleTabPosition()
fun getSearchContent(): String
}
fun getSearchContent() : String
interface Presenter : IHomeBaseContract.Presenter<View>
interface Model : IHomeBaseContract.Model {
/**
* 首页冥想请求
*/
fun museRequest(): Observable<MuseModuleBean>
}
}
\ No newline at end of file
package com.yidianling.home.event
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.RecyclerView
import android.text.TextUtils
import android.view.View
import com.alibaba.android.arouter.launcher.ARouter
import com.ydl.media.audio.AudioPlayer
import com.ydl.media.audio.model.Music
import com.ydl.media.view.PlayTypeEnum
import com.ydl.media.view.PlayerFloatHelper
import com.ydl.webview.H5Params
import com.ydl.webview.NewH5Activity
import com.ydl.ydl_router.manager.YDLRouterManager
import com.ydl.ydl_router.manager.YDLRouterParams
import com.ydl.ydl_router.util.YDLRouterParamsUrls
import com.ydl.ydlcommon.base.BaseActivity
import com.ydl.ydlcommon.base.config.HttpConfig
import com.ydl.ydlcommon.bean.ShareData
import com.ydl.ydlcommon.data.PlatformRamImpl
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlcommon.router.IYDLRouterConstant
import com.ydl.ydlcommon.utils.Utils
import com.ydl.ydlcommon.utils.actionutil.ActionCountUtils
import com.ydl.ydlcommon.utils.remind.ToastHelper
import com.ydl.ydlcommon.view.dialog.CommonDialog
import com.yidianling.consultant.constants.HomeBIConstants
import com.yidianling.home.R
import com.yidianling.home.constract.IHomeContract
import com.yidianling.home.model.bean.*
import com.yidianling.router.RouterManager
import com.yidianling.router.im.IMRequestCallback
import com.yidianling.tests.api.service.ITestsApiService
import com.yidianling.user.api.service.IUserService
import de.greenrobot.event.EventBus
import org.json.JSONObject
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
......@@ -46,389 +14,16 @@ import org.json.JSONObject
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeImpl : IHomeEvent {
val HOT_SEARCH_DOCTOR_NAME = "hot_search_doctor_name"
override fun consultItemClick(linkUrl: String?, doctorId: String) {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_EXPERT_INTRODUCTION_CLICK, doctorId)
if (null == linkUrl || linkUrl.isEmpty()) {
return
}
if (linkUrl.startsWith("http")) {
YDLRouterManager.router(
IYDLRouterConstant.ROUTER_H5_H5,
YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_URL, linkUrl), "")
} else {
YDLRouterManager.router(linkUrl)
}
}
override fun consultChatClick(doctorId: String?) {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_PRIVATE_CHAT_CLICK, doctorId
?: "")
if (!ModularServiceManager.provide(IUserService::class.java).isLogin()) {
//跳转登录
jumpToLogin()
return
}
if (mContext is AppCompatActivity && !TextUtils.isEmpty(doctorId)) {
//私聊
YDLRouterManager.router(IYDLRouterConstant.ROUTER_CHAT_PRIVATE,
YDLRouterParams()
.putExtra(IYDLRouterConstant.EXTRA_TOUID, doctorId!!)
.putExtra(IYDLRouterConstant.EXTRA_USERTYPE, "1"))
}
}
fun jumpToLogin() {
ARouter.getInstance().build("/user/login")
.navigation()
}
/**
* 获取咨询列表数据
* 最终调用
* @see com.yidianling.home.ui.fragment.YdlHomeFragment.getConsultData
*
* @param type 倾述类型
* @param selectPosition 选中的position
*/
override fun getConsultData(type: HomeHeaderBean.ConsultCategoryDateBean, selectPosition: Int) {
ActionCountUtils.count(HomeBIConstants.YDL_USER_CONSULT_TYPE_CLICK, type.name
?: "")
mHomeView!!.getConsultData(type.id.toString(), selectPosition)
}
private var headerView: View? = null
private var mContext: Context? = null
private var mHomeView: IHomeContract.View? = null
var COURSE_DETAIL_H5 = HttpConfig.WEB_URL + "fe-app-yidianling/course/Detail/"
constructor(context: Context, homeView: IHomeContract.View) {
mContext = context
this.mHomeView = homeView
}
override fun onPageScroll(view_rl_top_bg: View): RecyclerView.OnScrollListener? {
return object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if (headerView == null) headerView = recyclerView?.getChildAt(0)
val top = headerView?.top
val height = Math.abs(top!!)
var per = height.toFloat() / 500
//最大比例为1
if (per > 1f) {
per = 1f
}
val alpha = (per * 255).toInt()
// Log.e("Tag", "alpha=$alpha--per=$per")
view_rl_top_bg.background.mutate().alpha = alpha
}
}
}
override fun serviceCallClick() {
try {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_TELEPHONE_CUSTOMER_SERVICE_CLICK)
val tel = if (PlatformRamImpl.getInstance().getGlobalInfo() == null) "400-114-1010'" else PlatformRamImpl.getInstance().getGlobalInfo()!!.info.tel
var con = "\n400-114-1010\n早8:30-凌晨2:00"
if (PlatformRamImpl.getInstance().getGlobalInfo() != null && PlatformRamImpl.getInstance().getGlobalInfo()!!.info != null) {
con = PlatformRamImpl.getInstance().getGlobalInfo()?.info?.tel + "\n" + PlatformRamImpl.getInstance().getGlobalInfo()?.info?.work_time
}
val dialog = CommonDialog(mContext)
.setTitle("欢迎致电壹点灵客服热线")
.setMessage(con)
.setLeftOnclick("取消") { v1 ->
}.setRightClick("拨打") { v12 ->
val phoneIntent = Intent(Intent.ACTION_DIAL,
Uri.parse("tel:$tel"))
mContext?.startActivity(phoneIntent)
}
dialog.setMessageOnclick {
}
dialog.show()
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun searchTvClick(text: String) {
if (Utils.isFastClick()) {
//防止连击
return
}
var doctorName = if (text != mContext?.resources?.getString(R.string.search_hint) && text != mContext?.resources?.getString(R.string.platform_search)) text else ""
ARouter.getInstance()
.build("/consult/hot_search")
.withString(HOT_SEARCH_DOCTOR_NAME, doctorName)
.navigation()
}
override fun consultMoreClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
EventBus.getDefault().post(HomeModuleTabEvent(2))
// YDLRouterManager.router(IYDLRouterConstant.ROUTER_MAIN_TAB, YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_TAB, "2"))
ActionCountUtils.count(HomeBIConstants.YDL_USER_CONSULT_MORE_CLICK)
}
override fun bannerClick(banner: HomeHeaderBean.FocusListBean) {
ActionCountUtils.count(HomeBIConstants.YDL_USER_BANNER_CLICK, banner.focId.toString())
linkTo(banner.linkUrl.toString())
}
override fun categoryClick(data: HomeHeaderBean.AskCategoryDataBean) {
// linkTo(data.url.toString())
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_CONSULT_CLASSIFICATION_CLICK, data.cateId.toString(), data.cateTitle
?: "")
goExpertSearch(data)
}
private fun goExpertSearch(data: HomeHeaderBean.AskCategoryDataBean) {
if (!TextUtils.isEmpty(data.url) && data.url!!.endsWith("?")) {
data.url = data.url!!.substring(0, data.url!!.length - 1)
}
if ("全部类别" == data.cateTitle || "全部分类" == data.cateTitle) {
YDLRouterManager.router(IYDLRouterConstant.ROUTER_H5_H5,
YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_URL, HttpConfig.H5_URL + "experts/cates"))
} else {
//跳转咨询频道页 服务入口
YDLRouterManager.router(IYDLRouterConstant.ROUTER_CONSULT_LIST,
YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_CATEID, data.cateId.toString()).putExtra(IYDLRouterConstant.EXTRA_CATETITLE, data.cateTitle!!).putExtra(IYDLRouterConstant.EXTRA_SHOWTYPE, "0"))
}
}
override fun linkTo(linkUrl: String) {
if (Utils.isFastClick()) {
//防止连击
return
}
YDLRouterManager.router(linkUrl)
}
override fun reservationExpertsClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
EventBus.getDefault().post(HomeModuleTabEvent(2))
// YDLRouterManager.router(IYDLRouterConstant.ROUTER_MAIN_TAB,YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_TAB, "2"))
ActionCountUtils.count(HomeBIConstants.YDL_USER_CONSULT_CLICK)
// 咨询列表页(专家服务搜索页面) ydl-user://consult/list
// YDLRouterManager.router(IYDLRouterConstant.ROUTER_CONSULT_LIST)
}
override fun nowConfideClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
// ARouter.getInstance().build("/confide/home")
// .withFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
// .navigation()
ActionCountUtils.count(HomeBIConstants.YDL_USER_TALK_IN_TIME_CLICK)
//倾诉首页 ydl-user://confide/home
YDLRouterManager.router(IYDLRouterConstant.ROUTER_CONFIDE_HOME)
}
override fun psychologyClassClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
//课程频道页 ydl-user://course/home
// YDLRouterManager.router(IYDLRouterConstant.ROUTER_COURSE_HOME)
//埋点
ActionCountUtils.count(HomeBIConstants.YDL_USER_PSYCHOLOGICAL_CLASSROOM_CLICK)
ARouter.getInstance().build("/course/home").navigation()
}
override fun psychologyTestClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_PSYCHOLOGICAL_TEST_CLICK)
//测评频道首页 ydl-user://ceshi/home
YDLRouterManager.router(IYDLRouterConstant.ROUTER_TEST_HOME)
}
override fun confideMoreClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_LISTEN_MORE_CLICK)
//倾诉首页 ydl-user://qingshu/home
YDLRouterManager.router(IYDLRouterConstant.ROUTER_CONFIDE_HOME)
}
/**
* 倾述咨询师点击
* @param linkUrl 跳转地址
*/
override fun confideClick(linkUrl: String?, doctorId: Int) {
if (Utils.isFastClick()) {
//防止连击
return
}
if (null == linkUrl || linkUrl.isEmpty()) {
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_LISTENER_INTRODUCTION_CLICK, doctorId.toString())
if (linkUrl.startsWith("http")) {
YDLRouterManager.router(IYDLRouterConstant.ROUTER_H5_H5,
YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_URL, linkUrl), "")
} else {
YDLRouterManager.router(linkUrl)
}
}
/**
* 私聊
*/
override fun toChatForMsg(doctorId: String?) {
if (Utils.isFastClick()) {
//防止连击
return
}
if (!ModularServiceManager.provide(IUserService::class.java).isLogin()) {
//跳转登录
YDLRouterManager.router(IYDLRouterConstant.ROUTER_MINE_LOGIN)
return
}
if (mContext is AppCompatActivity && !TextUtils.isEmpty(doctorId)) {
//私聊
YDLRouterManager.router(IYDLRouterConstant.ROUTER_CHAT_PRIVATE,
YDLRouterParams()
.putExtra(IYDLRouterConstant.EXTRA_TOUID, doctorId!!)
.putExtra(IYDLRouterConstant.EXTRA_USERTYPE, "1"))
}
//todo xj
RouterManager.getImRouter().createTextMessage(doctorId, "你好,我想找你倾诉,请尽快上线私聊我,我在等你。", object : IMRequestCallback<Void> {
override fun onSuccess(aVoid: Void?) {
(mContext as BaseActivity).dismissProgressDialog()
ToastHelper.show("发送成功")
}
override fun onFailed(i: Int) {
(mContext as BaseActivity).dismissProgressDialog()
var message = "发送失败"
if (i == 7101) {
message = "您已被对方拉黑!"
}
ToastHelper.show(message)
}
override fun onException(throwable: Throwable?) {
(mContext as BaseActivity).dismissProgressDialog()
ToastHelper.show("发送异常")
}
})
}
override fun courseMreClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
//课程频道页 ydl-user://course/home
// YDLRouterManager.router(IYDLRouterConstant.ROUTER_COURSE_HOME)
ActionCountUtils.count(HomeBIConstants.YDL_USER_COURSE_MORE_CLICK)
ARouter.getInstance().build("/course/home").navigation()
}
override fun courseItemClick(bean: HomeCourseBean.ListBean) {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_COURSE_CLICK, bean.id.toString())
val h5Params = H5Params(COURSE_DETAIL_H5 + bean.id, mContext?.getString(R.string.platform_course_detail))
if (!TextUtils.isEmpty(bean.shareData?.shareUrl)) {
val shareData = ShareData(bean.shareData?.shareUrl, bean.shareData?.title, bean.shareData?.cover, bean.shareData?.desc)
h5Params.shareData = shareData
}
NewH5Activity.start(mContext, h5Params)
}
override fun askItemFocusClick(position: Int, id: String) {
if (!ModularServiceManager.provide(IUserService::class.java).isLogin()) {
//跳转登录
YDLRouterManager.router(IYDLRouterConstant.ROUTER_MINE_LOGIN)
return
}
//关注用户
mHomeView?.askFocus(position, id)
}
override fun askItemZanClick(position: Int, index: Int, id: String) {
if (!ModularServiceManager.provide(IUserService::class.java).isLogin()) {
//跳转登录
YDLRouterManager.router(IYDLRouterConstant.ROUTER_MINE_LOGIN)
return
}
//问答动态点赞
mHomeView?.askZan(position, index, id)
}
override fun askMoreClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_ASK_MORE_CLICK)
//心事动态频道页(首页--问答) ydl-user://answers/home
YDLRouterManager.router(IYDLRouterConstant.ROUTER_ANSWERS_HOME)
}
class HomeImpl(context: Context, homeView: IHomeContract.View) : HomeBaseImpl(context, homeView), IHomeEvent {
override fun museMoreClick(dataJson: String) {
if (Utils.isFastClick()) {
//防止连击
return
}
YDLRouterManager.router(IYDLRouterConstant.ROUTER_MUSE,
YDLRouterParams().putExtra(IYDLRouterConstant.MUSIC_URL, "")
.putExtra(IYDLRouterConstant.DATA_JSON, dataJson))
YDLRouterManager.router(
IYDLRouterConstant.ROUTER_MUSE,
YDLRouterParams().putExtra(IYDLRouterConstant.MUSIC_URL, "")
.putExtra(IYDLRouterConstant.DATA_JSON, dataJson))
}
override fun museClick(musicUrl: String, dataJson: String) {
......@@ -436,159 +31,10 @@ class HomeImpl : IHomeEvent {
//防止连击
return
}
YDLRouterManager.router(IYDLRouterConstant.ROUTER_MUSE,
YDLRouterParams().putExtra(IYDLRouterConstant.MUSIC_URL, musicUrl)
.putExtra(IYDLRouterConstant.DATA_JSON, dataJson))
}
override fun fmItemClick(bean: HomeFMBean.ListBean) {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_RADIO_CLICK, bean.id.toString())
//电台详情页面
YDLRouterManager.router(IYDLRouterConstant.ROUTER_FM_DETAIL,
YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_ID, bean.id.toString()))
YDLRouterManager.router(
IYDLRouterConstant.ROUTER_MUSE,
YDLRouterParams().putExtra(IYDLRouterConstant.MUSIC_URL, musicUrl)
.putExtra(IYDLRouterConstant.DATA_JSON, dataJson))
}
override fun fmPlayClick(fmDetail: HomeFMBean.ListBean) {
ActionCountUtils.count(HomeBIConstants.YDL_USER_RADIO_PLAY_CLICK, fmDetail.id.toString())
if (!TextUtils.isEmpty(fmDetail.fmUrl)) {
val music = Music()
music.path = fmDetail.fmUrl
music.album = fmDetail.imageUrl
music.artist = fmDetail.author
music.coverPath = fmDetail.imageUrl
music.title = fmDetail.name
AudioPlayer.get().singlePlay(music, false)
}
PlayerFloatHelper.isCanClick = true
if (PlayerFloatHelper.isShow(mContext!!)) {
if (PlayerFloatHelper.playingType == PlayTypeEnum.PLAY_TYPE_FM) {
PlayerFloatHelper.removeView(mContext!!)
PlayerFloatHelper.show(mContext!!)
} else {
PlayerFloatHelper.setPlayingState(mContext!!)
}
} else {
mContext?.let { PlayerFloatHelper.show(it) }
}
}
override fun fmMoreClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_HEART_RADIO_MORE_CLICK)
//fm列表页 ydl-user://fm/list
YDLRouterManager.router(IYDLRouterConstant.ROUTER_FM_LIST)
}
override fun articleItemClick(bean: HomeArticleBean.Bean?) {
if (Utils.isFastClick()) {
//防止连击
return
}
if (bean == null) {
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_ARTICLE_CLICK, bean.id.toString())
YDLRouterManager.router(IYDLRouterConstant.ROUTER_H5_H5,
YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_URL, bean.gethUrl()!!), "")
}
override fun articleMoreClick() {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_ARTICLE_MORE_CLICK)
//文章列表页 ydl-user://article/list
ARouter.getInstance().build("/article/list").navigation()
// YDLRouterManager.router(IYDLRouterConstant.ROUTER_ARTICLE_LIST)
}
override fun askItemClick(bean: HomeAskBean.DataBean) {
if (Utils.isFastClick()) {
//防止连击
return
}
ActionCountUtils.count(HomeBIConstants.YDL_USER_ASK_COMMENT_CLICK, bean.id.toString())
val bundle = Bundle()
bundle.putInt("trend_id", bean.id)
bundle.putInt("comment_count", bean.commentsCount)
bundle.putBoolean("is_comment", false)
//动态详情
ARouter.getInstance().build("/trends/detail")
.withBundle("bundle", bundle)
.navigation()
}
override fun publishTrendClick() {
val bundle = Bundle()
bundle.putString("publish_type", "topic_publish")
bundle.putString("topic_id", "44")
bundle.putString("topic_title", "今日打卡")
//发布动态
ARouter.getInstance().build("/trend/publish")
.withBundle("bundle", bundle)
.navigation()
}
/**
* 获取倾述列表数据
* 最终调用
* @see com.yidianling.home.ui.fragment.YdlHomeFragment.getConfideData
*
* @param type 倾述类型
* @param selectPosition 选中的position
*/
override fun getConfideData(type: HomeHeaderBean.ListenCategoryDateBean, selectPosition: Int) {
ActionCountUtils.count(HomeBIConstants.YDL_USER_LISTEN_TYPE_CLICK, type.name
?: "")
mHomeView!!.getConfideData(type.id.toString(), selectPosition)
}
override fun testItemClick(linkUrl: String?) {
if (Utils.isFastClick()) {
//防止连击
return
}
if (null == linkUrl || linkUrl.isEmpty()) {
return
}
if (linkUrl.startsWith("app")) {
val uri = Uri.parse(linkUrl)
if ("ceshi" == uri.host) {
val id = uri.getQueryParameter("id")
ModularServiceManager.provide(ITestsApiService::class.java).testDetailH5(id)
}
} else if (linkUrl.startsWith("http")) {
YDLRouterManager.router(IYDLRouterConstant.ROUTER_H5_H5,
YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_URL, linkUrl), "")
} else if (linkUrl.contains("ceshi/detail?")) {
val routerParamsUrls = YDLRouterParamsUrls(linkUrl)
val jsonObject = JSONObject(routerParamsUrls.getParams())
ModularServiceManager.provide(ITestsApiService::class.java).testDetailH5(jsonObject.getString("id").toString())
} else {
YDLRouterManager.router(linkUrl)
}
}
override fun testMoreClick() {
psychologyTestClick()
}
}
package com.yidianling.home.event
import android.support.v7.widget.RecyclerView
import android.view.View
import com.yidianling.home.model.bean.*
/**
* @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
* @描述: 首页点击事件接口类
* @Copyright Copyright (c) 2019
* @Company 壹点灵
* @date 2019/02/13
*/
interface IHomeEvent {
/**
* 服务电话点击事件
*/
fun serviceCallClick()
/**
* 动态编辑按钮点击
*/
fun publishTrendClick()
/**
* 咨询条目点击事件
*/
fun consultItemClick(linkUrl: String?, doctorId: String)
/**
* 咨询私聊点击事件
*/
fun consultChatClick(doctorId: String?)
/**
* 测试条目点击事件
*/
fun testItemClick(linkUrl: String?)
/**
* 测试更多点击事件
*/
fun testMoreClick()
/**
* 咨询更多点击事件
*/
fun consultMoreClick()
/**
* 搜索框点击事件
*/
fun searchTvClick(text:String)
/**
* 列表滚动事件
*/
fun onPageScroll(view_rl_top_bg: View): RecyclerView.OnScrollListener?
/**
* 跳转链接点击
* Banner & 首页分类 & 首页条目 使用
*/
fun linkTo(linkUrl: String)
/**
* banner点击跳转
*/
fun bannerClick(banner:HomeHeaderBean.FocusListBean)
/**
* 首页分类跳转
*/
fun categoryClick(category: HomeHeaderBean.AskCategoryDataBean)
/**
* 预约专家点击事件
*/
fun reservationExpertsClick()
/**
* 即可倾诉点击事件
*/
fun nowConfideClick()
/**
* 心理课堂点击事件
*/
fun psychologyClassClick()
/**
* 心理测试点击事件
*/
fun psychologyTestClick()
/**
* 倾诉更多点击事件
*/
fun confideMoreClick()
/**
* 倾述咨询师点击
* @param linkUrl 跳转地址
*/
fun confideClick(linkUrl: String?, doctorId: Int)
/**
* 私聊
*/
fun toChatForMsg(doctorId: String?)
/**
* 课程item点击事件
*/
fun courseItemClick(bean: HomeCourseBean.ListBean)
/**
* 课程更多点击事件
*/
fun courseMreClick()
/**
* 问答条目关注点击事件
* @param id : 用户uid
*/
fun askItemFocusClick(position:Int,id: String)
/**
* 问答条目点赞事件
* @param id : 动态id
*/
fun askItemZanClick(position:Int,index:Int,id: String)
/**
* 问答更多点击事件
*/
fun askMoreClick()
/**
* 问答条目点击事件
*/
fun askItemClick(bean:HomeAskBean.DataBean)
/**
* 冥想更多点击事件
*/
fun museMoreClick(dataJson: String)
/**
* 冥想item点击事件
*/
fun museClick(url: String, dataJson: String)
/**
* 电台条目点击播放事件
*/
fun fmPlayClick(bean: HomeFMBean.ListBean)
/**
* 电台条目点击进入详情
*/
fun fmItemClick(bean: HomeFMBean.ListBean)
/**
* 电台更多点击事件
*/
fun fmMoreClick()
/**
* 文章更多点击事件
*/
fun articleMoreClick()
/**
* 文章item点击事件
*/
fun articleItemClick(bean: HomeArticleBean.Bean?)
/**
* 获取倾述列表数据
* 最终调用
* @see com.yidianling.home.ui.fragment.YdlHomeFragment.getConfideData
*
* @param type 倾述类型
* @param selectPosition 选中的position
*/
fun getConfideData(type: HomeHeaderBean.ListenCategoryDateBean, selectPosition: Int)
/**
* 获取咨询列表数据
* 最终调用
* @see com.yidianling.home.ui.fragment.YdlHomeFragment.getConsultData
*
* @param type 类型
* @param selectPosition 选中的position
*/
fun getConsultData(type: HomeHeaderBean.ConsultCategoryDateBean, selectPosition: Int)
interface IRequestListener<T> {
fun onResponse(result:T)
}
}
\ No newline at end of file
package com.yidianling.home.http
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.data.http.BaseResponse
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlnet.YDLHttpUtils
import com.yidianling.home.model.bean.*
import com.yidianling.user.api.service.IUserService
import com.yidianling.home.model.bean.MuseModuleBean
import io.reactivex.Observable
/**
......@@ -16,110 +12,29 @@ import io.reactivex.Observable
* @Company 壹点灵
* @date 2018/8/22
*/
class HomeHttp private constructor() {
class HomeHttp {
companion object {
fun getInstance(): HomeHttp {
return Holder.INSTANCE
}
fun clearHomPagerApi() {
Holder.INSTANCE.homPagerApi = null
Holder.INSTANCE.phpHomPagerApi = null
}
}
object Holder {
val INSTANCE = HomeHttp()
}
private var homPagerApi: HomePagerApi? = null
private var phpHomPagerApi: HomePagerApi? = null
private fun getPhpHomPagerApi(): HomePagerApi {
if (phpHomPagerApi == null) {
phpHomPagerApi = YDLHttpUtils.obtainApi(HomePagerApi::class.java)
}
return phpHomPagerApi!!
}
private var homeApi: HomePagerApi? = null
private fun getHomPagerApi(): HomePagerApi {
if (homPagerApi == null) {
homPagerApi = YDLHttpUtils.obtainApi(HomePagerApi::class.java)
private fun getHomePagerApi(): HomePagerApi {
if (homeApi == null) {
homeApi = YDLHttpUtils.obtainApi(HomePagerApi::class.java)
}
return homPagerApi!!
}
//首页头部 分类&Banner 请求
fun newHomeHeaderRequest(): Observable<BaseAPIResponse<HomeHeaderBean>> {
return getHomPagerApi().getHomeHeaderData()
}
//首页倾述请求
fun getConfideData(goodType: String): Observable<BaseAPIResponse<HomeConfideBean>> {
val loginBean = ModularServiceManager.provide(IUserService::class.java).getUserInfo()
var userId = loginBean?.uid ?: "";
return getHomPagerApi().getConfideData(goodType, uid = userId);
}
//首页课程请求
fun getCourseData(listType: String = "10"): Observable<BaseAPIResponse<HomeCourseBean>> {
val loginBean = ModularServiceManager.provide(IUserService::class.java).getUserInfo()
var userId = loginBean?.uid ?: "";
return getHomPagerApi().getCourseData(listType, uid = userId);
}
//首页测试请求
fun getTestData(): Observable<BaseAPIResponse<MutableList<HomeTestItemBean>>> {
val loginBean = ModularServiceManager.provide(IUserService::class.java).getUserInfo()
var userId = loginBean?.uid ?: "";
return getHomPagerApi().getTestData(uid = userId)
}
//首页问答请求
fun getAskData(): Observable<BaseAPIResponse<HomeAskBean>> {
val loginBean = ModularServiceManager.provide(IUserService::class.java).getUserInfo()
var userId = loginBean?.uid ?: "";
var token = loginBean?.accessToken ?: "";
return getHomPagerApi().getAskData(accessToken = token, uid = userId);
}
//首页电台请求
fun getFMData(): Observable<BaseAPIResponse<HomeFMBean>> {
return getHomPagerApi().getFMData();
}
//首页文章请求
fun getArticleData(perPageRows: String = "4"): Observable<BaseAPIResponse<HomeArticleBean>> {
return getHomPagerApi().getArticleData()
}
//首页咨询请求
fun getConsultData(goodType: String): Observable<BaseAPIResponse<HomeConsultBean>> {
val loginBean = ModularServiceManager.provide(IUserService::class.java).getUserInfo()
var userId = loginBean?.uid ?: ""
return getHomPagerApi().getConsultData(category = goodType, uid = userId)
}
//首页问答 - 点赞
fun askZan(id: String): Observable<BaseResponse<AskResultBean>> {
val cmd = AskRequestParamBean.ZanAction("2", id)
return RxUtils.mapObservable(cmd).flatMap { getPhpHomPagerApi().askZan(it) }
// return getPhpHomPagerApi().askZan(formatParams(cmd))
}
//首页问答 - 关注
fun askFocus(id: String): Observable<BaseResponse<AskResultBean>> {
val cmd = AskRequestParamBean.FocusCmd(id, "1")
return RxUtils.mapObservable(cmd).flatMap { getPhpHomPagerApi().askFocus(it) }
return homeApi!!
}
//壹点冥想
fun newMuseRequest(): Observable<BaseAPIResponse<MuseModuleBean>> {
return getHomPagerApi().getMuseData()
return getHomePagerApi().getMuseData()
}
}
\ No newline at end of file
package com.yidianling.home.http
import com.ydl.ydlcommon.base.BaseApp
import com.ydl.ydlcommon.base.config.YDL_DOMAIN
import com.ydl.ydlcommon.base.config.YDL_DOMAIN_JAVA
import com.ydl.ydlcommon.data.PlatformDataManager
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.data.http.BaseResponse
import com.yidianling.home.model.bean.*
import com.yidianling.common.tools.RxDeviceTool
import com.yidianling.home.model.bean.MuseModuleBean
import io.reactivex.Observable
import retrofit2.http.*
import retrofit2.http.GET
import retrofit2.http.Headers
/**
* @author jiucheng
......@@ -19,92 +16,6 @@ import retrofit2.http.*
* @date 2018/8/22
*/
interface HomePagerApi {
/**
* 首页头部数据 Banner&分类
*/
@GET("home/index")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getHomeHeaderData(): Observable<BaseAPIResponse<HomeHeaderBean>>
/**
* 首页咨询请求
* goodType 为空或不传 则获取默认类型数据
*/
@GET("doctor/list")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getConsultData(@Query("categories") category: String,
@Query("limit") limit: String = "3",
@Query("page") page: String = "1",
@Query("uid") uid: String,
@Query("searchWord") searchWord: String = "",
@Query("showType") showType: String = "0",
@Query("ffrom") ffrom: String = PlatformDataManager.getRam().getChannelName(),
@Query("version") version: String = RxDeviceTool.getAppVersionName(BaseApp.getApp())
): Observable<BaseAPIResponse<HomeConsultBean>>
/**
* 首页倾述请求
* goodType 为空或不传 则获取默认类型数据
*/
@GET("auth/listen/search")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getConfideData(@Query("goodType") goodType: String,
@Query("limit") limit: String = "3",
@Query("page") page: String = "1",
// 1: 查询第一个类型列表,较goodType比,低优先级
@Query("isDefaultType") isDefaultType: String = "1",
@Query("uid") uid: String,
@Query("ffrom") ffrom: String = PlatformDataManager.getRam().getChannelName(),
@Query("version") version: String = RxDeviceTool.getAppVersionName(BaseApp.getApp())
): Observable<BaseAPIResponse<HomeConfideBean>>
//首页课程请求
@GET("auth/course/getList")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getCourseData(@Query("listType") listType: String = "10",
@Query("limit") limit: String = "3",
@Query("uid") uid: String,
@Query("ffrom") ffrom: String = PlatformDataManager.getRam().getChannelName(),
@Query("version") version: String = RxDeviceTool.getAppVersionName(BaseApp.getApp())
): Observable<BaseAPIResponse<HomeCourseBean>>
//首页测试请求
@GET("test-item/home-recommend")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getTestData(@Query("uid") uid: String,
@Query("ffrom") ffrom: String = PlatformDataManager.getRam().getChannelName(),
@Query("version") version: String = RxDeviceTool.getAppVersionName(BaseApp.getApp())
): Observable<BaseAPIResponse<MutableList<HomeTestItemBean>>>
//首页问答请求
@GET("ask/list-old")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getAskData(@Query("perPageRows") perPageRows: String = "6",
@Query("tab") tab: String = "2",
@Query("accessToken") accessToken: String,
@Query("uid") uid: String
): Observable<BaseAPIResponse<HomeAskBean>>
//首页电台请求
@GET("fm/list/all")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getFMData(@Query("perPageRows") perPageRows: String = "4"): Observable<BaseAPIResponse<HomeFMBean>>
//首页文章请求
@GET("article/list/all")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getArticleData(@Query("perPageRows") perPageRows: String = "4"): Observable<BaseAPIResponse<HomeArticleBean>>
//首页问答 - 点赞
@FormUrlEncoded
@POST("sq-active/zan")
fun askZan(@FieldMap params: Map<String, String>): Observable<BaseResponse<AskResultBean>>
//首页问答 - 关注
@FormUrlEncoded
@POST("sq-active/focus")
fun askFocus(@FieldMap params: Map<String, String>): Observable<BaseResponse<AskResultBean>>
//壹点 - 冥想
@GET("meditation/meditation/list")
......
package com.yidianling.home.model
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.data.http.RxUtils
import com.yidianling.home.constract.IHomeContract
import com.yidianling.home.http.HomeHttp
import com.yidianling.home.model.bean.*
import com.yidianling.home.model.bean.MuseModuleBean
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
......@@ -15,100 +15,15 @@ import io.reactivex.schedulers.Schedulers
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeModelImpl {
companion object {
/**
* 首页咨询请求
*/
fun consultRequest(category: String): Observable<HomeConsultBean> {
return HomeHttp.getInstance().getConsultData(category).compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { HomeConsultBean(true) }
}
/**
* 首页问答 - 点赞
*/
fun askZan(id: String): Observable<AskResultBean> {
return HomeHttp.getInstance().askZan(id).compose(RxUtils.resultData())
}
/**
* 首页问答 - 关注
*/
fun askFocus(id: String): Observable<AskResultBean> {
return HomeHttp.getInstance().askFocus(id).compose(RxUtils.resultData())
}
/**
* 首页电台请求
*/
fun fmRequest(): Observable<HomeFMBean> {
return HomeHttp.getInstance().getFMData().compose(RxUtils.resultJavaData())
.onErrorReturn { HomeFMBean(true) }
}
/**
* 首页课程请求
*/
fun courseRequest(): Observable<HomeCourseBean> {
return HomeHttp.getInstance().getCourseData().compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { HomeCourseBean(true) }
}
/**
* 首页测试题请求
*/
fun testRequest(): Observable<BaseAPIResponse<MutableList<HomeTestItemBean>>> {
return HomeHttp.getInstance().getTestData()
}
/**
* 首页倾听请求
*/
fun confideRequest(goodType: String): Observable<HomeConfideBean> {
return HomeHttp.getInstance().getConfideData(goodType).compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { HomeConfideBean(true) }
}
/**
* 首页问答请求
*/
fun askRequest(): Observable<HomeAskBean> {
return HomeHttp.getInstance().getAskData().compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { HomeAskBean(true) }
}
/**
* 首页文章请求
*/
fun articleRequest(): Observable<HomeArticleBean> {
return HomeHttp.getInstance().getArticleData().compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { HomeArticleBean(true) }
}
/**
* 首页头部 分类&Banner请求
*/
fun headerRequest(): Observable<HomeHeaderBean> {
return HomeHttp.getInstance().newHomeHeaderRequest().compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { HomeHeaderBean(true) }
}
/**
* 首页冥想请求
*/
fun museRequest(): Observable<MuseModuleBean> {
return HomeHttp.getInstance().newMuseRequest().compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { MuseModuleBean(true) }
}
class HomeModelImpl : BaseHomeModelImpl(), IHomeContract.Model {
/**
* 首页冥想请求
*/
override fun museRequest(): Observable<MuseModuleBean> {
return HomeHttp.getInstance().newMuseRequest().compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { MuseModuleBean(true) }
}
......
package com.yidianling.home.presenter
import android.annotation.SuppressLint
import android.content.Context
import android.text.TextUtils
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.ydl.ydlcommon.base.BaseApp
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlcommon.data.http.ThrowableConsumer
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlcommon.mvp.base.SimplePresenter
import com.ydl.ydlcommon.utils.SharedPreferencesEditor
import com.ydl.ydlcommon.utils.YDLAsyncUtils
import com.yidianling.common.tools.LogUtil
import com.yidianling.common.tools.RxAppTool
import com.yidianling.consultant.api.IConsultantService
import com.yidianling.home.constract.IHomeContract
import com.yidianling.home.constract.YdlHomeViewHolderConstract
import com.yidianling.home.model.HomeModelImpl
import com.yidianling.home.model.bean.*
import com.yidianling.home.utils.HomeFileUtils
import com.yidianling.home.utils.HomeLogPrinter
import com.yidianling.common.tools.LogUtil
import com.yidianling.common.tools.RxAppTool
import com.yidianling.consultant.api.IConsultantService
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.functions.Action
import io.reactivex.functions.Consumer
import io.reactivex.schedulers.Schedulers
......@@ -36,123 +28,21 @@ import io.reactivex.schedulers.Schedulers
* @Company 壹点灵
* @date 2019/02/13
*/
class HomePresenterImpl : SimplePresenter<IHomeContract.View>() {
private var CACHE_HOME_PAGER_DATA = "cache_home_pager_data"
//首页json文件和缓存数据结构不一致时临时使用
private var IS_NEW_CACHE_HOME_PAGER_DATA = "IS_NEW_CACHE_HOME_PAGER_DATA"
//首页缓存版本号
private var HOME_PAGER_DATA_CACHE_VERISON = "HOME_PAGER_DATA_CACHE_VERISON"
private var mConsultDisposable: Disposable? = null;
private var mConfideDisposable: Disposable? = null;
private var mHomeDisposable: Disposable? = null;
var mConfideType: String = ""
var mConsultType: String = ""
/**
* 本次启动时候已经获取过优惠券的标记
* 因为优惠券调用逻辑在onResum方法中执行,避免不必要的判断逻辑,增加标记
* 每次请求优惠券成功之后,将值置为true
*/
private var hasRequestCoupon = false
@Volatile
private var mHomeAskBean: HomeAskBean? = null
/**
* 防止重复请求
*/
// private var zanRequestList: MutableList<String>? = mutableListOf()
//首页数据缓存
private var homeTempData: HomePagerDataBean = HomePagerDataBean()
/**
* 加载本地缓存
*/
fun localHomeData(context: Context) {
YDLAsyncUtils.asyncAsResult(object : YDLAsyncUtils.AsyncObjecyerResult {
override fun doAsyncAction(): Any {
//首页缓存数据
var cacheHomeData = ""
//是否为新的数据结构
var isNewPageData = SharedPreferencesEditor.getString(IS_NEW_CACHE_HOME_PAGER_DATA);
var homeCacheVersion =
SharedPreferencesEditor.getString(HOME_PAGER_DATA_CACHE_VERISON);
var appVersionCode = RxAppTool.getAppVersionCode(BaseApp.getApp())
//版本更新后不使用上个版本的首页缓存
if (isNewPageData.isEmpty() || (!TextUtils.isEmpty(homeCacheVersion) && appVersionCode > homeCacheVersion.toInt())) {
cacheHomeData = ""
} else {
//上次首页缓存数据
cacheHomeData = SharedPreferencesEditor.getString(CACHE_HOME_PAGER_DATA)
}
if (cacheHomeData.isEmpty()) {
//第一次安装使用本地临时数据
cacheHomeData =
String(HomeFileUtils.getAssertsFile(context, "home_data.json")!!)
}
return cacheHomeData
}
override fun asyncResult(`object`: Any?) {
//如果没 有缓存数据,显示加载框
if (`object` !is String || TextUtils.isEmpty(`object`)) {
mView?.let { it.showRefreshLayout() }
}
if (`object` is String) {
val list = Gson().fromJson<MutableList<HomePagerDataBean>>(
`object`,
object : TypeToken<MutableList<HomePagerDataBean>>() {
}.type
)
if (null != list && !list.isEmpty()) {
mView?.let { it.homeDataResponse(list) }
saveTempData(list)
}
}
}
})
}
/**
* 刷新首页数据请求
*/
fun refreshHomeData() {
val homeItemFromTempData = getHomeItemFromTempData(
HomeHeaderBean(true),
YdlHomeViewHolderConstract.PAGER_BANNER_VIEW
)
mConsultType =
if (homeItemFromTempData.headerBean?.listenCategoryDate == null || homeItemFromTempData.headerBean?.listenCategoryDate!!.isEmpty()) {
"1"
} else {
homeItemFromTempData.headerBean?.consultCategoryData!![0].id.toString()
}
mConfideType = ""
mView?.resetModuleTabPosition()
loadHomeData()
class HomePresenterImpl: BaseHomePresenterImpl<IHomeContract.View, IHomeContract.Model>(), IHomeContract.Presenter {
override fun createModel(): IHomeContract.Model {
return HomeModelImpl()
}
/**
* 获取首页数据请求
*/
@SuppressLint("CheckResult")
fun loadHomeData() {
override fun loadHomeData() {
disposeHome()
val homeList: MutableList<HomePagerDataBean> = mutableListOf()
LogUtil.d("mConsultType-loadHomeData:" + mConsultType)
LogUtil.d("mConsultType-loadHomeData:$mConsultType")
Observable.mergeArray(
HomeModelImpl.headerRequest().map { it ->
mModel.headerRequest().map { it ->
//首页头部数据 分类 & Banner
homeList.add(
getHomeItemFromTempData(
......@@ -160,32 +50,34 @@ class HomePresenterImpl : SimplePresenter<IHomeContract.View>() {
YdlHomeViewHolderConstract.PAGER_BANNER_VIEW
)
)
mView?.let { i -> i.homeHeadResponse(it) }
mView.homeHeadResponse(it)
//获取咨询分类后,再次请求咨询模块数据,防止出现默认分类为空,数据不对
if (it.consultCategoryData != null && it.consultCategoryData!!.size > 0) {
if (it.consultCategoryData != null && it.consultCategoryData!!.isNotEmpty()) {
//咨询分类和缓存分类不一致,重新加载咨询列表数据
if (!it.consultCategoryData!![0].id.toString().equals(mConsultType)) {
if (it.consultCategoryData!![0].id.toString() != mConsultType) {
getConsultData("${it.consultCategoryData!![0].id}", 0)
}
}
homeList.add(HomePagerDataBean(YdlHomeViewHolderConstract.BUTTON_BANNER_VIEW))
//保存热门搜索列表
it.keywordData?.let { ModularServiceManager.provide(IConsultantService::class.java).setHotSearch(it) }
it.keywordData?.let {
ModularServiceManager.provide(IConsultantService::class.java).setHotSearch(it)
}
},
HomeModelImpl.consultRequest(mConsultType).map {
mModel.consultRequest(mConsultType).map {
//首页咨询数据
homeList.add(getHomeItemFromTempData(it, YdlHomeViewHolderConstract.CONSULT_VIEW))
},
//GoodType为空 获取默认类型
HomeModelImpl.confideRequest(mConfideType).map {
mModel.confideRequest(mConfideType).map {
//首页倾述数据
homeList.add(getHomeItemFromTempData(it, YdlHomeViewHolderConstract.CONFIDE_VIEW))
},
HomeModelImpl.courseRequest().map {
mModel.courseRequest().map {
//首页课程数据
homeList.add(getHomeItemFromTempData(it, YdlHomeViewHolderConstract.COURSE_VIEW))
},
HomeModelImpl.testRequest().map {
mModel.testRequest().map {
//首页测试数据
val homeTestBean = HomeTestBean()
homeTestBean.testItemList = it.data
......@@ -196,7 +88,7 @@ class HomePresenterImpl : SimplePresenter<IHomeContract.View>() {
)
)
},
HomeModelImpl.askRequest().map {
mModel.askRequest().map {
//首页问答数据
homeList.add(
getHomeItemFromTempData(
......@@ -205,11 +97,11 @@ class HomePresenterImpl : SimplePresenter<IHomeContract.View>() {
)
)
},
HomeModelImpl.museRequest().map {
mModel.museRequest().map {
//首页冥想数据
homeList.add(getHomeItemFromTempData(it, YdlHomeViewHolderConstract.MUSE_VIEW))
},
HomeModelImpl.fmRequest().map {
mModel.fmRequest().map {
//首页电台数据
homeList.add(
getHomeItemFromTempData(
......@@ -218,7 +110,7 @@ class HomePresenterImpl : SimplePresenter<IHomeContract.View>() {
)
)
},
HomeModelImpl.articleRequest().map {
mModel.articleRequest().map {
//首页文章数据
homeList.add(getHomeItemFromTempData(it, YdlHomeViewHolderConstract.ARTICLE_VIEW))
homeList.add(HomePagerDataBean(YdlHomeViewHolderConstract.FOOTER_VIEW))
......@@ -227,11 +119,11 @@ class HomePresenterImpl : SimplePresenter<IHomeContract.View>() {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {}, object : ThrowableConsumer() {
override fun accept(msg: String) {
mView?.homeDataFail(msg)
mView.homeDataFail(msg)
}
}, Action {
homeList.sortWith(compareBy { it.type })
mView?.let { it.homeDataResponse(homeList) }
mView.homeDataResponse(homeList)
//更新本地缓存数据
SharedPreferencesEditor.putString(CACHE_HOME_PAGER_DATA, Gson().toJson(homeList))
SharedPreferencesEditor.putString(IS_NEW_CACHE_HOME_PAGER_DATA, true.toString())
......@@ -242,18 +134,38 @@ class HomePresenterImpl : SimplePresenter<IHomeContract.View>() {
HomeLogPrinter.printLongLog(
HomePresenterImpl::class.java.simpleName,
Gson().toJson(homeList)
);
)
})
}
fun saveTempData(list: MutableList<HomePagerDataBean>) {
override fun refreshHomeData() {
val homeItemFromTempData = getHomeItemFromTempData(
HomeHeaderBean(true),
YdlHomeViewHolderConstract.PAGER_BANNER_VIEW
)
mConsultType =
if (homeItemFromTempData.headerBean?.listenCategoryDate == null || homeItemFromTempData.headerBean?.listenCategoryDate!!.isEmpty()) {
"1"
} else {
homeItemFromTempData.headerBean?.consultCategoryData!![0].id.toString()
}
mConfideType = ""
mView.resetModuleTabPosition()
loadHomeData()
}
override fun saveTempData(list: MutableList<HomePagerDataBean>) {
val homeBean = HomePagerDataBean()
for (dataBean in list) {
when (dataBean.type) {
YdlHomeViewHolderConstract.PAGER_BANNER_VIEW -> {
homeBean.headerBean = dataBean.headerBean
dataBean.headerBean?.keywordData?.let {
ModularServiceManager.provide(IConsultantService::class.java).setHotSearch(it)
ModularServiceManager.provide(IConsultantService::class.java)
.setHotSearch(it)
}
}
YdlHomeViewHolderConstract.CONSULT_VIEW -> {
......@@ -269,7 +181,7 @@ class HomePresenterImpl : SimplePresenter<IHomeContract.View>() {
homeBean.testListBean = dataBean.testListBean
}
YdlHomeViewHolderConstract.ASSUAGE_GRIEF_VIEW -> {
mHomeAskBean = dataBean.askBean;
mHomeAskBean = dataBean.askBean
homeBean.askBean = dataBean.askBean
}
YdlHomeViewHolderConstract.MUSE_VIEW -> {
......@@ -286,7 +198,7 @@ class HomePresenterImpl : SimplePresenter<IHomeContract.View>() {
homeTempData = homeBean
}
private fun getHomeItemFromTempData(
override fun getHomeItemFromTempData(
dataBean: HomeItemBaseBean,
type: Int
): HomePagerDataBean {
......@@ -334,135 +246,4 @@ class HomePresenterImpl : SimplePresenter<IHomeContract.View>() {
}
return item
}
/**
*获取倾述列表
*/
@SuppressLint("CheckResult")
fun getConfideData(type: String, selectPosition: Int) {
disposeConfide()
disposeHome()
mConfideType = type
HomeModelImpl.confideRequest(type)
.map { it }
.filter { true }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
mView?.confideDataResponse(it, selectPosition)
}, object : ThrowableConsumer() {
override fun accept(msg: String) {
mView?.homeDataFail(msg)
}
})
}
/**
*获取咨询列表
*/
fun getConsultData(type: String, selectPosition: Int) {
disposeConsult()
disposeHome()
mConsultType = type
// mConsultDisposable = HomeModelImpl.consultRequest(type)
// .map { it }
// .filter { true }
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .subscribe(Consumer {
// mView?.consultDataResponse(it, selectPosition)
// }, object : ThrowableConsumer() {
// override fun accept(msg: String) {
// mView?.homeDataFail(msg)
// }
// })
}
fun disposeConfide() {
if (mConfideDisposable != null && !mConfideDisposable!!.isDisposed) {
mConfideDisposable?.dispose()
}
}
fun disposeConsult() {
if (mConsultDisposable != null && !mConsultDisposable!!.isDisposed) {
mConsultDisposable?.dispose()
}
}
fun disposeHome() {
if (mHomeDisposable != null && !mHomeDisposable!!.isDisposed) {
mHomeDisposable?.dispose()
}
}
/**
* 首页问答 - 点赞
*/
@SuppressLint("CheckResult")
fun askZan(position: Int, index: Int, id: String) {
// if (zanRequestList?.contains(id)!!) {
// return
// }
// zanRequestList?.add(id)
HomeModelImpl.askZan(id)
.compose(RxUtils.netCheck())
.subscribeOn(Schedulers.io())
.map { result ->
// mHomeAskBean!!.data!![index].isZan = result.status
// if (result.status == 1) mHomeAskBean!!.data!![index].zanCount++ else mHomeAskBean!!.data!![index].zanCount--
// mHomeAskBean
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
// zanRequestList?.remove(id)
// view.askDataResponse(it!!, position)
}, object : ThrowableConsumer() {
override fun accept(msg: String) {
//zanRequestList?.remove(id)
mView?.homeDataFail(msg)
}
})
}
/**
* 首页问答 - 关注
*/
fun askFocus(position: Int, id: String) {
HomeModelImpl.askFocus(id)
.compose(RxUtils.netCheck())
.subscribeOn(Schedulers.io())
.map { result ->
// //遍历更改集合中已关注用户状态
// var tempList = mutableListOf<HomeAskBean.DataBean>();
// for ((index, value) in mHomeAskBean!!.data?.withIndex()!!) {
// if (value.uid.toString() == id) {
// value.isFocused = result.status
// }
// tempList.add(value)
// }
// mHomeAskBean!!.data = tempList
// mHomeAskBean
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
// view.askDataResponse(it!!, position)
}, object : ThrowableConsumer() {
override fun accept(msg: String) {
mView.homeDataFail(msg)
}
})
}
inner class CouponReceiveBean {
var couponIds: List<String>? = null
}
}
\ No newline at end of file
......@@ -22,7 +22,6 @@ import com.ydl.ydlcommon.utils.SharedPreferencesEditor
import com.ydl.ydlcommon.utils.StatusBarUtils
import com.ydl.ydlcommon.utils.Utils
import com.ydl.ydlcommon.utils.actionutil.ActionCountUtils
import com.ydl.ydlcommon.utils.actionutil.BIConstants
import com.yidianling.consultant.api.IConsultantService
import com.yidianling.consultant.constants.HomeBIConstants
import com.yidianling.home.R
......@@ -32,12 +31,12 @@ import com.yidianling.home.constract.YdlHomeViewHolderConstract
import com.yidianling.home.dialog.ActivityDialog
import com.yidianling.home.dialog.ActivityGuideDialog
import com.yidianling.home.event.HomeImpl
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.listener.HomeConfideRecyleSuspendListener
import com.yidianling.home.model.bean.*
import com.yidianling.home.presenter.HomePresenterImpl
import com.yidianling.home.ui.view.CouponDialog
import com.yidianling.home.utils.Double11ActivityManagerUtils
import com.yidianling.home.ui.utils.Double11ActivityManagerUtils
import com.yidianling.home.utils.HomeAnimUtils
import com.yidianling.user.api.service.IUserService
import kotlinx.android.synthetic.ydl.home_module_fragment.*
......@@ -56,7 +55,7 @@ class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterImpl>()
SwipeRefreshLayout.OnRefreshListener {
private var adapter: YdlHomeAdapter? = null
private var homeEvent: IHomeEvent? = null
private var homeEvent: HomeImpl? = null
private var dialog: CouponDialog? = null
//双11活动弹窗
//双11活动弹窗
......@@ -133,7 +132,7 @@ class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterImpl>()
}
private fun initAdapter() {
mPresenter?.localHomeData(this.context)
mPresenter?.localHomeData(this.context, "home_data.json")
adapter = YdlHomeAdapter(context, homeEvent!!, ArrayList())
val layoutManager = LinearLayoutManager(context)
home_module_fragment_recycler.layoutManager = layoutManager
......
......@@ -5,10 +5,11 @@ import android.support.v7.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.ydl.ydl_image.manager.YDLImageCacheManager
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.model.bean.HomeArticleBean
import com.ydl.ydl_image.manager.YDLImageCacheManager
import kotlinx.android.synthetic.ydl.home_module_article_item_view.view.*
/**
......@@ -18,14 +19,18 @@ import kotlinx.android.synthetic.ydl.home_module_article_item_view.view.*
* @Company 壹点灵
* @date 2019/02/14
*/
class HomeArticleItemView(private val mContext: Context, private var homeEvent: IHomeEvent?): LinearLayout(mContext) {
class HomeArticleItemView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) :
LinearLayout(mContext) {
init {
initView()
}
private fun initView() {
val params = RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
val params = RecyclerView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams = params
View.inflate(mContext, R.layout.home_module_article_item_view, this)
}
......@@ -36,7 +41,7 @@ class HomeArticleItemView(private val mContext: Context, private var homeEvent:
homeModuleArticleItemViewAuthor.text = bean?.name
homeModuleArticleItemViewGreatNum.text = bean?.countOfFavorite.toString()
homeModuleArticleItemViewLookNum.text = bean?.readNum.toString()
YDLImageCacheManager.showImage(mContext,bean?.imgUrl,homeModuleArticleItemViewImg)
YDLImageCacheManager.showImage(mContext, bean?.imgUrl, homeModuleArticleItemViewImg)
setOnClickListener {
homeEvent?.articleItemClick(bean)
......
......@@ -6,7 +6,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeArticleBean
import kotlinx.android.synthetic.ydl.home_module_article_view.view.*
......@@ -17,7 +17,7 @@ import kotlinx.android.synthetic.ydl.home_module_article_view.view.*
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeArticleView(private val mContext: Context, private var homeEvent: IHomeEvent?) : LinearLayout(mContext) {
class HomeArticleView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) : LinearLayout(mContext) {
private var cacheList : ArrayList<HomeArticleBean.Bean> = ArrayList()
......
......@@ -2,11 +2,10 @@ package com.yidianling.home.ui.view
import android.content.Context
import android.support.v7.widget.CardView
import android.util.Log
import android.view.View
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.ydl.ydl_image.manager.YDLImageCacheManager
import com.yidianling.common.tools.RxDeviceTool
import kotlinx.android.synthetic.ydl.home_module_assuage_grief_image_more_five_item_view.view.*
......@@ -20,7 +19,7 @@ import kotlinx.android.synthetic.ydl.home_module_assuage_grief_image_under_two_i
* @Company 壹点灵
* @date 2019/02/15
*/
class HomeAssuageGriefImageItemView(private val mContext: Context, private val urlList: List<String>, private var homeEvent: IHomeEvent?) : CardView(mContext) {
class HomeAssuageGriefImageItemView(private val mContext: Context, private val urlList: List<String>, private var homeEvent: IHomeBaseEvent?) : CardView(mContext) {
init {
initView()
......
......@@ -11,7 +11,7 @@ import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeAskBean
import com.ydl.ydl_image.config.SimpleImageOpConfiger
import com.ydl.ydl_image.manager.YDLImageCacheManager
......@@ -33,7 +33,7 @@ import kotlinx.android.synthetic.ydl.home_module_assuage_grief_item_view.view.*
* @Company 壹点灵
* @date 2019/02/15
*/
class HomeAssuageGriefItemView(private val mContext: Context, private var homeEvent: IHomeEvent?) : LinearLayout(mContext) {
class HomeAssuageGriefItemView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) : LinearLayout(mContext) {
private var homeAssuageGriefImageItemView: HomeAssuageGriefImageItemView? = null
private var focusClick: Boolean = false;
......
......@@ -5,7 +5,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeAskBean
import kotlinx.android.synthetic.ydl.home_module_assuage_grief_view.view.*
......@@ -16,7 +16,7 @@ import kotlinx.android.synthetic.ydl.home_module_assuage_grief_view.view.*
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeAssuageGriefView(private val mContext: Context, private var homeEvent: IHomeEvent?) : LinearLayout(mContext) {
class HomeAssuageGriefView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) : LinearLayout(mContext) {
private var cacheList: ArrayList<HomeAskBean.DataBean> = ArrayList()
......
......@@ -2,12 +2,11 @@ package com.yidianling.home.ui.view
import android.content.Context
import android.support.v7.widget.RecyclerView
import android.util.Log
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.common.tools.RxDeviceTool
import kotlinx.android.synthetic.ydl.home_module_button_banner_view.view.*
......@@ -18,7 +17,7 @@ import kotlinx.android.synthetic.ydl.home_module_button_banner_view.view.*
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeButtonBannerView(private val mContext: Context, private var homeEvent: IHomeEvent?) : LinearLayout(mContext) {
class HomeButtonBannerView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) : LinearLayout(mContext) {
private var buttonParams: LinearLayout.LayoutParams? = null
......
......@@ -9,7 +9,7 @@ import android.widget.LinearLayout
import android.widget.RelativeLayout
import com.yidianling.home.R
import com.yidianling.home.adapter.HomeCategoryAdapter
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeHeaderBean
import com.yidianling.common.tools.RxImageTool
import kotlinx.android.synthetic.ydl.home_module_category_container.view.*
......@@ -19,7 +19,7 @@ import kotlinx.android.synthetic.ydl.home_module_category_container.view.*
* created by HaoRui
* des: 首页分类Pager包装类
*/
class HomeCategoryContainer(private val mContext: Context, private var homeEvent: IHomeEvent?) : RelativeLayout(mContext), ViewPager.OnPageChangeListener {
class HomeCategoryContainer(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) : RelativeLayout(mContext), ViewPager.OnPageChangeListener {
private var mHomeCategoryAdapter: HomeCategoryAdapter? = null
private var indicatorImages: MutableList<ImageView>? = ArrayList()
......
......@@ -35,14 +35,12 @@ class HomeCategoryViewPager : ViewPager {
private var mOnSingleTouchListener: OnSingleTouchListener? = null
override fun onInterceptTouchEvent(arg0: MotionEvent): Boolean {
// TODO Auto-generated method stub
//当拦截触摸事件到达此位置的时候,返回true,
//说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent
return true
}
override fun onTouchEvent(arg0: MotionEvent): Boolean {
// TODO Auto-generated method stub
//每次进行onTouch事件都记录当前的按下的坐标
curP.x = arg0.x
curP.y = arg0.y
......
......@@ -8,7 +8,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeConfideBean
import com.ydl.ydl_image.config.SimpleImageOpConfiger
import com.ydl.ydl_image.manager.YDLImageCacheManager
......@@ -22,7 +22,7 @@ import kotlinx.android.synthetic.ydl.home_module_confide_expert_info_view.view.*
* @Company 壹点灵
* @date 2019/2/16
*/
class HomeConfideExpertInfoView(private var mContext: Context, private var homeEvent: IHomeEvent?) : FrameLayout(mContext) {
class HomeConfideExpertInfoView(private var mContext: Context, private var homeEvent: IHomeBaseEvent?) : FrameLayout(mContext) {
private var dp70 = 0
init {
......@@ -46,6 +46,8 @@ class HomeConfideExpertInfoView(private var mContext: Context, private var homeE
setHead(bean)
//设置名称
tv_name.text = bean.confidedName
//设置倾诉标签View的最大宽度
tag_view.setConfideWidth()
//咨询师标签
tag_view.initData(bean.confidedTag as MutableList<String>)
//设置向TA倾诉人数
......
......@@ -11,7 +11,7 @@ import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeConfideBean
import com.yidianling.home.model.bean.HomeHeaderBean
import com.yidianling.common.tools.LogUtil
......@@ -24,7 +24,7 @@ import kotlinx.android.synthetic.ydl.home_module_confide_view.view.*
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeConfideView(private val mContext: Context, private var homeEvent: IHomeEvent?) : LinearLayout(mContext) {
class HomeConfideView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) : LinearLayout(mContext) {
private var mLastPosition: Int = 0
/**
* 专家信息view缓存list
......
......@@ -6,7 +6,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeConsultBean
import com.ydl.ydl_image.config.SimpleImageOpConfiger
import com.ydl.ydl_image.manager.YDLImageCacheManager
......@@ -22,7 +22,7 @@ import kotlinx.android.synthetic.ydl.home_module_consult_item_view.view.*
* @Company 壹点灵
* @date 2019/2/16
*/
class HomeConsultItemView(private var mContext: Context, private var homeEvent: IHomeEvent?) : FrameLayout(mContext) {
class HomeConsultItemView(private var mContext: Context, private var homeEvent: IHomeBaseEvent?) : FrameLayout(mContext) {
private var dp70 = 0
init {
......
......@@ -11,7 +11,7 @@ import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeConsultBean
import com.yidianling.home.model.bean.HomeHeaderBean
import com.yidianling.common.tools.LogUtil
......@@ -24,7 +24,7 @@ import kotlinx.android.synthetic.ydl.home_module_confide_view.view.*
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeConsultView(private val mContext: Context, private var homeEvent: IHomeEvent?) : LinearLayout(mContext) {
class HomeConsultView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) : LinearLayout(mContext) {
private var mLastPosition: Int = 0
/**
* 专家信息view缓存list
......
......@@ -5,7 +5,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.RelativeLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeCourseBean
import com.ydl.ydl_image.manager.YDLImageCacheManager
import kotlinx.android.synthetic.ydl.home_module_course_item_view.view.*
......@@ -17,7 +17,7 @@ import kotlinx.android.synthetic.ydl.home_module_course_item_view.view.*
* @Company 壹点灵
* @date 2019/02/14
*/
class HomeCourseItemView(private val mContext: Context, private var homeEvent: IHomeEvent?): RelativeLayout(mContext) {
class HomeCourseItemView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?): RelativeLayout(mContext) {
init {
initView()
......
......@@ -5,7 +5,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeCourseBean
import kotlinx.android.synthetic.ydl.home_module_course_view.view.*
......@@ -16,7 +16,7 @@ import kotlinx.android.synthetic.ydl.home_module_course_view.view.*
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeCourseView(private val mContext: Context, private var homeEvent: IHomeEvent?): LinearLayout(mContext) {
class HomeCourseView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?): LinearLayout(mContext) {
private var cacheList : ArrayList<HomeCourseBean.ListBean> = ArrayList()
......
......@@ -5,7 +5,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeFMBean
import com.yidianling.common.tools.RxImageTool
import kotlinx.android.synthetic.ydl.home_module_intelligent_item_view.view.*
......@@ -17,7 +17,7 @@ import kotlinx.android.synthetic.ydl.home_module_intelligent_item_view.view.*
* @Company 壹点灵
* @date 2019/02/14
*/
class HomeIntelligentItemView(private val mContext: Context, private var homeEvent: IHomeEvent?): LinearLayout(mContext) {
class HomeIntelligentItemView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?): LinearLayout(mContext) {
private var params:LinearLayout.LayoutParams? = null
......
......@@ -4,7 +4,7 @@ import android.content.Context
import android.view.View
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeFMBean
import com.ydl.ydl_image.config.ISimpleImageOpConfig
import com.ydl.ydl_image.config.SimpleImageOpConfiger
......@@ -20,7 +20,7 @@ import kotlinx.android.synthetic.ydl.home_module_intelligent_top_item_view.view.
* @Company 壹点灵
* @date 2019/02/15
*/
class HomeIntelligentTopItemView(private val mContext: Context, private var homeEvent: IHomeEvent?): LinearLayout(mContext) {
class HomeIntelligentTopItemView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?): LinearLayout(mContext) {
init {
initView()
......
......@@ -5,7 +5,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeFMBean
import kotlinx.android.synthetic.ydl.home_module_intelligent_view.view.*
......@@ -16,7 +16,7 @@ import kotlinx.android.synthetic.ydl.home_module_intelligent_view.view.*
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeIntelligentView(private val mContext: Context, private var homeEvent: IHomeEvent?) : LinearLayout(mContext) {
class HomeIntelligentView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) : LinearLayout(mContext) {
private var cacheList : ArrayList<HomeFMBean.ListBean> = ArrayList()
......
......@@ -19,7 +19,8 @@ import kotlinx.android.synthetic.ydl.home_module_muse_view.view.*
* @Company 壹点灵
* @date 2019/09/10
*/
class HomeMuseView(private val mContext: Context, private var homeEvent: IHomeEvent?) : LinearLayout(mContext) {
class HomeMuseView(private val mContext: Context, private var homeEvent: IHomeEvent?) :
LinearLayout(mContext) {
private var cacheList: ArrayList<HomeMuseView> = ArrayList()
......@@ -30,7 +31,10 @@ class HomeMuseView(private val mContext: Context, private var homeEvent: IHomeEv
@SuppressLint("RestrictedApi")
private fun initView() {
orientation = VERTICAL
val params = RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
val params = RecyclerView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams = params
View.inflate(mContext, R.layout.home_module_muse_view, this)
homeModuleMuseViewHomeCommonTitleView.setTitle("助眠·冥想")
......
......@@ -10,7 +10,7 @@ import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.TextView
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeHeaderBean
import com.ydl.ydl_image.module.GlideApp
import com.ydl.ydlcommon.utils.ScreenUtil
......@@ -24,7 +24,7 @@ import kotlinx.android.synthetic.ydl.home_module_pager_banner_category_view.view
* @Company 壹点灵
* @date 2019/02/16
*/
class HomePagerBannerCategoryItemView(mContext: Context, homeEvent: IHomeEvent) : FrameLayout(mContext) {
class HomePagerBannerCategoryItemView(mContext: Context, homeEvent: IHomeBaseEvent) : FrameLayout(mContext) {
/**
* 数据缓存
*/
......@@ -69,7 +69,7 @@ class HomePagerBannerCategoryItemView(mContext: Context, homeEvent: IHomeEvent)
/**
* 测评首页事件处理类
*/
private var homeEvent: IHomeEvent? = null
private var homeEvent: IHomeBaseEvent? = null
init {
initView()
......
......@@ -13,7 +13,7 @@ import android.widget.LinearLayout
import com.ydl.ydlcommon.utils.actionutil.ActionCountUtils
import com.yidianling.consultant.constants.HomeBIConstants
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeHeaderBean
import kotlinx.android.synthetic.ydl.home_module_real_view_in.view.*
import kotlinx.android.synthetic.ydl.home_module_real_view_left.view.*
......@@ -26,7 +26,7 @@ import kotlinx.android.synthetic.ydl.home_module_real_view_out.view.*
* @Company 壹点灵
* @date 2019/02/16
*/
class HomePagerBannerRealView(mContext : Context,homeEvent : IHomeEvent) : LinearLayout(mContext){
class HomePagerBannerRealView(mContext : Context,homeEvent : IHomeBaseEvent) : LinearLayout(mContext){
private val STATUS_IN = 0
private val STATUS_OUT = 1
......@@ -52,7 +52,7 @@ class HomePagerBannerRealView(mContext : Context,homeEvent : IHomeEvent) : Linea
*/
private var mDataList : List<HomeHeaderBean.HomeSaleDataBean>? = null
private var homeEvent : IHomeEvent? = null
private var homeEvent : IHomeBaseEvent? = null
private val mHandler: Handler = object : Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message?) {
......
......@@ -8,7 +8,7 @@ import android.widget.RelativeLayout
import com.ydl.ydlcommon.utils.YdlBuryPointUtil
import com.ydl.ydlcommon.view.banner.GlideImageLoader
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeHeaderBean
import com.yidianling.common.tools.RxDeviceTool
import com.yidianling.common.tools.RxImageTool
......@@ -22,7 +22,7 @@ import kotlinx.android.synthetic.ydl.home_module_pager_banner_view.view.*
* @Company 壹点灵
* @date 2019/02/13
*/
class HomePagerBannerView(private val mContext: Context, private var homeEvent: IHomeEvent?) : RelativeLayout(mContext) {
class HomePagerBannerView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) : RelativeLayout(mContext) {
private val mImageViews = ArrayList<String>()
private var homePagerBannerCategoryView: HomePagerBannerCategoryItemView? = null
......
......@@ -5,7 +5,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeTestItemBean
import com.ydl.ydl_image.manager.YDLImageCacheManager
import com.yidianling.common.tools.RxImageTool
......@@ -18,7 +18,7 @@ import kotlinx.android.synthetic.ydl.home_module_test_item_view.view.*
* @Company 壹点灵
* @date 2019/02/14
*/
class HomeTestItemView(private val mContext: Context, private var homeEvent: IHomeEvent?) : LinearLayout(mContext) {
class HomeTestItemView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) : LinearLayout(mContext) {
private var params: LinearLayout.LayoutParams? = null
......
......@@ -4,7 +4,7 @@ import android.content.Context
import android.view.View
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeTestItemBean
import com.ydl.ydl_image.config.ISimpleImageOpConfig
import com.ydl.ydl_image.config.SimpleImageOpConfiger
......@@ -20,7 +20,7 @@ import kotlinx.android.synthetic.ydl.home_module_test_top_item_view.view.*
* @Company 壹点灵
* @date 2019/02/15
*/
class HomeTestTopItemView(private val mContext: Context, private var homeEvent: IHomeEvent?): LinearLayout(mContext) {
class HomeTestTopItemView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?): LinearLayout(mContext) {
init {
initView()
......
......@@ -5,7 +5,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.yidianling.home.R
import com.yidianling.home.event.IHomeEvent
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeTestItemBean
import kotlinx.android.synthetic.ydl.home_module_test_view.view.*
......@@ -16,7 +16,7 @@ import kotlinx.android.synthetic.ydl.home_module_test_view.view.*
* @Company 壹点灵
* @date 2019/02/13
*/
class HomeTestView(private val mContext: Context, private var homeEvent: IHomeEvent?) : LinearLayout(mContext) {
class HomeTestView(private val mContext: Context, private var homeEvent: IHomeBaseEvent?) : LinearLayout(mContext) {
private var cacheList : ArrayList<HomeTestItemBean> = ArrayList()
......
<resources>
<string name="app_name">home-module</string>
<string name="home_module_real_appoint">预约了</string>
<string name="search_hint">搜索话题、咨询师姓名</string>
</resources>
......@@ -5,16 +5,6 @@
<item name="android:textSize">15sp</item>
</style>
<style name="NoTitleTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="android:windowActionBar">false</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="colorPrimary">@color/platform_main_theme_blue</item>
<item name="colorPrimaryDark">@color/platform_main_theme_blue</item>
<item name="colorAccent">@color/platform_main_theme_blue</item>
</style>
<!--设置Tablayout字体加粗-->
<style name="activityDialog" parent="NoTitleTheme">
......
......@@ -58,6 +58,14 @@ class TagView : LinearLayout {
}
/**
* 设置倾诉最大宽度
* 倾诉和咨询模块使用的宽度是不一样的
*/
fun setConfideWidth(){
tagViewMaxWidth = RxDeviceTool.getScreenWidth(context) - RxImageTool.dip2px(164f)
}
/**
* 设置数据
*/
fun initData(list: MutableList<String>?) {
......@@ -78,6 +86,10 @@ class TagView : LinearLayout {
mCacheList?.addAll(list)
removeAllViews()
for (i in list.indices) {
//太多显示不全
if (i>2){
continue
}
bindView()
//这块的非主流操作是因为我要取textView来计算文字的宽度
//但是第一次判断要在view添加上 才能取到 故放在了创建view的下面
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment