添加搜索页
|
|
@ -64,7 +64,7 @@
|
|||
android:resizeableActivity="true"
|
||||
android:roundIcon="@mipmap/ic_launcher_icon"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/Theme.Material"
|
||||
android:theme="@style/Theme.Base"
|
||||
android:usesCleartextTraffic="true"
|
||||
tools:replace="android:allowBackup,android:supportsRtl">
|
||||
|
||||
|
|
|
|||
|
|
@ -2,11 +2,11 @@ package com.cheng.bole.bean
|
|||
|
||||
import java.io.Serializable
|
||||
|
||||
class CityBean(
|
||||
class AreaBean(
|
||||
val id: Int = 0,
|
||||
val pid: Int = 0,
|
||||
val name: String = "",
|
||||
val amount: String = "",
|
||||
var children: MutableList<CityBean> = mutableListOf(),
|
||||
var children: MutableList<AreaBean> = mutableListOf(),
|
||||
var isChecked: Boolean = false
|
||||
) : Serializable
|
||||
|
|
@ -13,32 +13,4 @@ data class BidItemBean(
|
|||
val money: String,
|
||||
val tipsTime: String,
|
||||
val star: String
|
||||
) {
|
||||
fun getShortName(): String {
|
||||
return when (typeName) {
|
||||
"招标计划" -> "招标"
|
||||
"采购公告" -> "采购"
|
||||
"招标公告" -> "预告"
|
||||
"合同公告" -> "合同"
|
||||
"中标公告" -> "中标"
|
||||
"竞争性磋商" -> "竞争性磋商"
|
||||
"更正公告" -> "更正"
|
||||
"终止公告" -> "终止"
|
||||
else -> "其他"
|
||||
}
|
||||
}
|
||||
|
||||
fun getTypeColor(): Int {
|
||||
return when (typeName) {
|
||||
"招标计划" -> Color.parseColor("#2B88F9")
|
||||
"采购公告" -> Color.parseColor("#FF7344")
|
||||
"招标公告" -> Color.parseColor("#14CEB3")
|
||||
"合同公告" -> Color.parseColor("#FFA91D")
|
||||
"中标公告" -> Color.parseColor("#FF1B1B")
|
||||
"竞争性磋商" -> Color.parseColor("#0DA9FF")
|
||||
"更正公告" -> Color.parseColor("#7066FF")
|
||||
"终止公告" -> Color.parseColor("#8C9199")
|
||||
else -> Color.parseColor("#EEEEEE")
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
package com.cheng.bole.bean
|
||||
|
||||
import com.cheng.bole.manager.UserConfigManager
|
||||
import java.io.Serializable
|
||||
|
||||
class SearchOptionBean(
|
||||
val title: String,
|
||||
val items: List<OptionItem>,
|
||||
var isChecked: Boolean = false
|
||||
) : Serializable {
|
||||
class OptionItem(
|
||||
val id: Int = 0,
|
||||
val name: String = "",
|
||||
var isChecked: Boolean = false,
|
||||
|
||||
var startTime: String = "",
|
||||
var endTime: String = ""
|
||||
) : Serializable
|
||||
|
||||
companion object {
|
||||
fun getAreaOptionList(): List<SearchOptionBean> {
|
||||
val areaList = UserConfigManager.getAreaList()
|
||||
val list = mutableListOf<SearchOptionBean>()
|
||||
list.add(SearchOptionBean("全国地区", listOf(
|
||||
OptionItem(0, "全国", true)
|
||||
)))
|
||||
areaList.forEach { area ->
|
||||
val cityList = mutableListOf<OptionItem>()
|
||||
cityList.add(OptionItem(0, "全部"))
|
||||
area.children.forEach { city ->
|
||||
cityList.add(OptionItem(city.id, city.name))
|
||||
}
|
||||
list.add(SearchOptionBean(area.name, cityList))
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
fun getTimeOptionList(): List<SearchOptionBean> {
|
||||
val list = mutableListOf<SearchOptionBean>()
|
||||
list.add(SearchOptionBean("时间排序", listOf(
|
||||
OptionItem(0, "全部时间", true),
|
||||
OptionItem(1, "近三天"),
|
||||
OptionItem(2, "近七天"),
|
||||
OptionItem(3, "近一个月"),
|
||||
OptionItem(4, "近三个月"),
|
||||
OptionItem(5, "近一年")
|
||||
)))
|
||||
return list
|
||||
}
|
||||
|
||||
fun getSortOptionList(): List<SearchOptionBean> {
|
||||
val list = mutableListOf<SearchOptionBean>()
|
||||
list.add(SearchOptionBean("排序方式", listOf(
|
||||
OptionItem(0, "综合排序", true),
|
||||
OptionItem(1, "时间排序")
|
||||
)))
|
||||
return list
|
||||
}
|
||||
|
||||
fun getTypeOptionList(): List<SearchOptionBean> {
|
||||
val list = mutableListOf<SearchOptionBean>()
|
||||
val typeList = mutableListOf<OptionItem>()
|
||||
UserConfigManager.getBidTypes().forEach {
|
||||
typeList.add(OptionItem(it.id.toInt(), it.name))
|
||||
}
|
||||
list.add(SearchOptionBean("信息类型", typeList))
|
||||
return list
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3,8 +3,8 @@ package com.cheng.bole.bean
|
|||
import java.io.Serializable
|
||||
|
||||
data class WxShareEntity(
|
||||
val content: String = "",
|
||||
val image: String = "",
|
||||
val link: String = "",
|
||||
val title: String = ""
|
||||
var content: String = "",
|
||||
var image: String = "",
|
||||
var link: String = "",
|
||||
var title: String = ""
|
||||
) : Serializable
|
||||
|
|
@ -27,9 +27,8 @@ object Constants {
|
|||
const val Encrypt = "zpzkfp72v3hgatzg5w7pyg86x5342kxt"
|
||||
const val Signature = "ckBHUSWBx3TqwNT2kxMrsXyXFuA3PW"
|
||||
|
||||
val almmsht = Typeface.createFromAsset(Utils.getApp().assets, "fonts/Alimama ShuHeiTi.ttf")
|
||||
val almmsht = Typeface.createFromAsset(Utils.getApp().assets, "fonts/AlimamaShuHeiTi.ttf")
|
||||
val dDIN_PRO_M = Typeface.createFromAsset(Utils.getApp().assets, "fonts/D-DIN-PRO-500-Medium.otf")
|
||||
val youSheBiaoTiHei = Typeface.createFromAsset(Utils.getApp().assets, "fonts/YouSheBiaoTiHei.ttf")
|
||||
val douyinsansB = Typeface.createFromAsset(Utils.getApp().assets, "fonts/DouyinSansBold.otf")
|
||||
val pmzdbt = Typeface.createFromAsset(Utils.getApp().assets, "fonts/PangMenZhengDaoBiaoTiTi.ttf")
|
||||
}
|
||||
|
|
@ -29,56 +29,19 @@ object EventConstants {
|
|||
|
||||
const val ERROR_CLIENT_ALIPAY_ERR = "client.alipay.err" //支付宝支付失败
|
||||
|
||||
const val ERROR_CLIENT_DOWNLOAD_IMG = "client.download.img.err" //图片下载失败
|
||||
|
||||
const val ERROR_CLIENT_DOWNLOAD_VIDEO = "client.download.video.err" //视频下载失败
|
||||
|
||||
const val ERROR_CLIENT_DOWNLOAD_AUDIO = "client.download.audio.err" //音频下载失败
|
||||
|
||||
const val CANCEL_DOWNLOAD_VIDEO = "client.download.video.cancel" //取消视频下载
|
||||
|
||||
const val PAUSE_DOWNLOAD_VIDEO = "client.download.video.pause" //暂停视频下载
|
||||
|
||||
const val CONTINUE_DOWNLOAD_VIDEO = "client.download.video.continue" //继续视频下载
|
||||
|
||||
const val RESTART_DOWNLOAD_VIDEO = "client.download.video.restart" //重新视频下载
|
||||
|
||||
const val SPEED_UP_DOWNLOAD_VIDEO = "client.download.video.speed.up" //加速视频下载
|
||||
|
||||
const val BACKGROUND_CLIENT_DOWNLOAD = "client.download.background" //后台下载
|
||||
|
||||
const val FLOAT_WINDOW_CLICK = "client.float.window.click" //点击悬浮窗
|
||||
|
||||
const val SAVE_AI_MEDIA = "client.ai.media.save" //ai生成文件保存
|
||||
|
||||
const val RECOGNIZE_AUDIO_TO_TEXT = "client.audio.text.recognize" //音频转文字
|
||||
|
||||
const val PKG_UPDATE = "client.pkg.update" //升级弹窗点击更新
|
||||
|
||||
const val PKG_CANCEL = "client.pkg.cancel" //升级弹窗点击取消
|
||||
|
||||
const val GET_MATERIAL = "client.get.material" //获取素材
|
||||
const val JUMP_TO_BID_DETAIL = "client.jump.to.bid.detail" //跳转到标讯详情页
|
||||
|
||||
const val GET_MATERIAL_CANCEL = "client.get.material.cancel" //取消获取素材
|
||||
|
||||
const val DIALOG_CONFIRM_SAVE_FILE = "client.dialog.confirm.save.file" //保存文件地址弹框确认
|
||||
const val JUMP_TO_BID_SEARCH = "client.jump.to.bid.search" //跳转到搜索
|
||||
|
||||
const val DIALOG_GO_TO_VIEW = "client.dialog.go.to.view" //前往保存文件的地址查看
|
||||
|
||||
const val JUMP_TO_ABOUT_US = "client.jump.to.about.us" //界面跳转
|
||||
|
||||
const val JUMP_TO_LINK_EXTRACT = "client.jump.to.link.extract" //跳转链接提取
|
||||
|
||||
const val JUMP_TO_WECHAT_VIDEO = "client.jump.to.wechat.video" //跳转视频号
|
||||
|
||||
const val JUMP_TO_WECHAT_PLAYBACK = "client.jump.to.wechat.video.playback" //跳转直播回放
|
||||
|
||||
const val JUMP_TO_COURSE_WX_VIDEO = "client.course.wechat.video" //视频号视频教程
|
||||
|
||||
const val JUMP_TO_COURSE_PLAYBACK = "client.course.playback" //直播回放视频教程
|
||||
|
||||
const val JUMP_TO_TOOL = "client.jump.to.home.tool" //跳转工具
|
||||
|
||||
const val MAIN_CENTER_ENABLE = "client.main.center.enable" //首页跳转个人中心
|
||||
|
||||
const val JUMP_TO_MEMBER_RECHARGE = "client.jump.to.member.recharge" //跳转到充值页
|
||||
|
|
@ -95,21 +58,13 @@ object EventConstants {
|
|||
|
||||
const val JUMP_TO_ACCOUNT_MANAGE = "client.jump.to.account.manage" //跳转到账号管理
|
||||
|
||||
const val JUMP_TO_DOWNLOAD_HISTORY = "client.jump.to.download.history" //跳转到下载记录
|
||||
|
||||
const val JUMP_TO_DOWNLOAD_TASK_LIST = "client.jump.to.download.task.list" //跳转到下载任务列表
|
||||
|
||||
const val JUMP_TO_RECHARGE_DIAMOND = "client.jump.to.recharge.diamond" //跳转到M币充值
|
||||
|
||||
const val JUMP_TO_COUPON_LIST = "client.jump.to.coupon.list" //跳转优惠券列表
|
||||
|
||||
const val JUMP_TO_CHALLENGE_TASK = "client.jump.to.challenge.task" //跳转到0元挑战
|
||||
|
||||
const val JUMP_TO_SHARE_WX_VIDEO = "client.jump.to.wechat.share.video" //跳转到视频号分享
|
||||
|
||||
const val JUMP_TO_SHARE_WX_PLAYBACK = "client.jump.to.wechat.share.playback" //跳转到直播回放分享
|
||||
|
||||
const val JUMP_TO_COURSE = "client.jump.to.course" //跳转到指导教程
|
||||
|
||||
const val DOWNLOAD_FILE = "client.download.file" //下载文件
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,4 @@
|
|||
package com.cheng.bole.event
|
||||
|
||||
class FavoriteEvent {
|
||||
}
|
||||
|
|
@ -10,7 +10,7 @@ import okhttp3.RequestBody.Companion.toRequestBody
|
|||
|
||||
object EventReportManager {
|
||||
|
||||
fun eventReport(key: String?, value: String?, extra: String) {
|
||||
fun eventReport(key: String?, value: String? = "", extra: String = "") {
|
||||
GlobalScope.launch {
|
||||
try {
|
||||
val jsonObject = JSONObject()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,44 @@
|
|||
package com.cheng.bole.manager
|
||||
|
||||
import android.text.TextUtils
|
||||
import com.example.base.utils.MMKVUtils
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.reflect.TypeToken
|
||||
|
||||
/**
|
||||
* 搜索历史
|
||||
*/
|
||||
object SearchHistoryManager {
|
||||
|
||||
fun addHistory(keyword: String): List<String> {
|
||||
val list = getHistory()
|
||||
if (!list.contains(keyword)) {
|
||||
if (list.size == 20) list.removeLast()
|
||||
list.add(0, keyword)
|
||||
MMKVUtils.put("search_history", Gson().toJson(list))
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
fun updateHistory(keyword: String): List<String> {
|
||||
val list = getHistory()
|
||||
if (list.contains(keyword)) {
|
||||
list.remove(keyword)
|
||||
}
|
||||
list.add(0, keyword)
|
||||
MMKVUtils.put("search_history", Gson().toJson(list))
|
||||
return list
|
||||
}
|
||||
|
||||
fun getHistory(): MutableList<String> {
|
||||
val str = MMKVUtils.getString("search_history")
|
||||
if (!TextUtils.isEmpty(str)) {
|
||||
return Gson().fromJson(str, object : TypeToken<MutableList<String>>() {}.type)
|
||||
}
|
||||
return mutableListOf()
|
||||
}
|
||||
|
||||
fun clear() {
|
||||
MMKVUtils.removeKey("search_history")
|
||||
}
|
||||
}
|
||||
|
|
@ -3,6 +3,8 @@ package com.cheng.bole.manager
|
|||
import android.os.Build
|
||||
import android.text.TextUtils
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import com.cheng.bole.bean.BidTypeBean
|
||||
import com.cheng.bole.bean.AreaBean
|
||||
import com.cheng.bole.net.ApiFactory
|
||||
import com.example.base.extensions.toast
|
||||
import com.example.base.utils.MMKVUtils
|
||||
|
|
@ -210,6 +212,60 @@ object UserConfigManager {
|
|||
return emptyList()
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索排序
|
||||
*/
|
||||
private fun saveSearchSort(sort: String) {
|
||||
MMKVUtils.put("search_sort", sort)
|
||||
}
|
||||
|
||||
fun getSearchSort(): String {
|
||||
return MMKVUtils.getString("search_sort") ?: ""
|
||||
}
|
||||
|
||||
/**
|
||||
* 地区列表
|
||||
*/
|
||||
fun saveAreaList(list: List<AreaBean>) {
|
||||
if (list.isNotEmpty()) {
|
||||
MMKVUtils.put("area_list", Gson().toJson(list))
|
||||
}
|
||||
}
|
||||
|
||||
fun getAreaList(): MutableList<AreaBean> {
|
||||
val str = MMKVUtils.getString("area_list")
|
||||
if (!TextUtils.isEmpty(str)) {
|
||||
return Gson().fromJson(str, object : TypeToken<MutableList<AreaBean>>() {}.type)
|
||||
}
|
||||
return mutableListOf()
|
||||
}
|
||||
|
||||
/**
|
||||
* 城市列表
|
||||
*/
|
||||
fun getCityList(): List<AreaBean> {
|
||||
val list = mutableListOf<AreaBean>()
|
||||
getAreaList().forEach {
|
||||
list.addAll(it.children)
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
/**
|
||||
* 招标类型
|
||||
*/
|
||||
fun saveBidTypes(list: List<BidTypeBean>) {
|
||||
MMKVUtils.put("bid_type", Gson().toJson(list))
|
||||
}
|
||||
|
||||
fun getBidTypes(): List<BidTypeBean> {
|
||||
val str = MMKVUtils.getString("bid_type")
|
||||
if (!TextUtils.isEmpty(str)) {
|
||||
return Gson().fromJson(str, object : TypeToken<List<BidTypeBean>>() {}.type)
|
||||
}
|
||||
return emptyList()
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存个推cid
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ package com.cheng.bole.net
|
|||
import com.cheng.bole.bean.BidDetailBean
|
||||
import com.cheng.bole.bean.BidItemBean
|
||||
import com.cheng.bole.bean.BidTypeBean
|
||||
import com.cheng.bole.bean.CityBean
|
||||
import com.cheng.bole.bean.AreaBean
|
||||
import com.cheng.bole.bean.CompanyBean
|
||||
import com.cheng.bole.bean.CorpInfoBean
|
||||
import com.cheng.bole.bean.GuideTotalBidInfoBean
|
||||
|
|
@ -182,13 +182,13 @@ interface ApiService {
|
|||
* 城市列表
|
||||
*/
|
||||
@GET("/api/city")
|
||||
suspend fun getCityList(): HttpBaseResult<List<CityBean>>
|
||||
suspend fun getAreaList(): HttpBaseResult<List<AreaBean>>
|
||||
|
||||
/**
|
||||
* 获取当前城市
|
||||
*/
|
||||
@GET("/api/city/default")
|
||||
suspend fun getUserCity(): HttpBaseResult<CityBean>
|
||||
suspend fun getUserCity(): HttpBaseResult<AreaBean>
|
||||
|
||||
/**
|
||||
* 总计商机
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ class AccountListDialog : DialogFragment() {
|
|||
|
||||
binding = DialogAccountListBinding.bind(view)
|
||||
|
||||
binding.tvTitle.typeface = Constants.youSheBiaoTiHei
|
||||
binding.tvTitle.typeface = Constants.douyinsansB
|
||||
|
||||
binding.mRecyclerView.adapter = mAdapter
|
||||
binding.mRecyclerView.addItemDecoration(SpacesItemDecoration(DensityUtils.dp2px(10f)))
|
||||
|
|
|
|||
|
|
@ -0,0 +1,104 @@
|
|||
package com.cheng.bole.ui.dialog
|
||||
|
||||
import android.app.Dialog
|
||||
import android.graphics.Color
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import android.os.Bundle
|
||||
import android.view.Gravity
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.DialogFragment
|
||||
import com.cheng.bole.R
|
||||
import com.cheng.bole.databinding.DialogDatePickerBinding
|
||||
import com.example.base.extensions.onClick
|
||||
import com.example.base.utils.ScreenUtils
|
||||
import com.github.gzuliyujiang.wheelpicker.annotation.DateMode
|
||||
import com.github.gzuliyujiang.wheelpicker.entity.DateEntity
|
||||
import java.util.Calendar
|
||||
import java.util.Date
|
||||
|
||||
class DatePickerDialog : DialogFragment() {
|
||||
private val title by lazy {arguments?.getString("title")}
|
||||
private val time by lazy { arguments?.getLong("time") ?: System.currentTimeMillis() }
|
||||
private val startTime by lazy { arguments?.getLong("start_time") ?: 0 }
|
||||
private val endTime by lazy { arguments?.getLong("end_time") ?: System.currentTimeMillis() }
|
||||
private val dateMode by lazy { arguments?.getInt("date_mode") ?: DateMode.YEAR_MONTH_DAY }
|
||||
|
||||
private var selectedTime: Calendar = Calendar.getInstance()
|
||||
|
||||
private var mOnBackListener: ((Long) -> Unit)? = null //回调事件
|
||||
|
||||
lateinit var binding: DialogDatePickerBinding
|
||||
|
||||
override fun onStart() {
|
||||
super.onStart()
|
||||
val window = dialog?.window
|
||||
val windowParams = window?.attributes
|
||||
windowParams?.dimAmount = 0.7f
|
||||
windowParams?.width = ScreenUtils.getWindowSize().x
|
||||
windowParams?.gravity = Gravity.BOTTOM
|
||||
windowParams?.windowAnimations = R.style.dialog_bottom
|
||||
dialog?.window?.attributes = windowParams
|
||||
}
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||
dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
|
||||
return super.onCreateView(inflater, container, savedInstanceState)
|
||||
}
|
||||
|
||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||
val view = layoutInflater.inflate(R.layout.dialog_date_picker, null)
|
||||
binding = DialogDatePickerBinding.bind(view)
|
||||
|
||||
binding.tvTitle.text = title
|
||||
|
||||
selectedTime.timeInMillis = time
|
||||
|
||||
binding.datePicker.setRange(DateEntity.target(Date(startTime)), if (endTime != 0L) DateEntity.target(Date(endTime)) else null, DateEntity.target(Date(time)))
|
||||
binding.datePicker.setDateMode(dateMode)
|
||||
binding.datePicker.setOnDateSelectedListener { year, month, day ->
|
||||
selectedTime.set(Calendar.YEAR, year)
|
||||
selectedTime.set(Calendar.MONTH, month - 1)
|
||||
selectedTime.set(Calendar.DAY_OF_MONTH, day)
|
||||
}
|
||||
|
||||
binding.tvConfirm.onClick {
|
||||
mOnBackListener?.invoke(selectedTime.timeInMillis)
|
||||
dismiss()
|
||||
}
|
||||
|
||||
binding.tvCancel.onClick {
|
||||
dismiss()
|
||||
}
|
||||
|
||||
val dialog = Dialog(requireContext())
|
||||
dialog.setContentView(view)
|
||||
return dialog
|
||||
}
|
||||
|
||||
fun setOnSelectListener(listener: ((Long) -> Unit)) {
|
||||
mOnBackListener = listener
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
fun newInstance(
|
||||
title: String? = "",
|
||||
time: Long = System.currentTimeMillis(),
|
||||
startTime: Long = 0,
|
||||
endTime: Long = System.currentTimeMillis(),
|
||||
dateMode: Int = DateMode.YEAR_MONTH_DAY
|
||||
): DatePickerDialog {
|
||||
val arg = Bundle()
|
||||
val fragment = DatePickerDialog()
|
||||
arg.putString("title", title)
|
||||
arg.putLong("time", time)
|
||||
arg.putLong("start_time", startTime)
|
||||
arg.putLong("end_time", endTime)
|
||||
arg.putInt("date_mode", dateMode)
|
||||
fragment.arguments = arg
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,144 @@
|
|||
package com.cheng.bole.ui.dialog
|
||||
|
||||
import android.app.Dialog
|
||||
import android.graphics.Color
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import android.os.Bundle
|
||||
import android.os.Environment
|
||||
import android.text.TextUtils
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.DialogFragment
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter
|
||||
import com.chad.library.adapter.base.viewholder.BaseViewHolder
|
||||
import com.cheng.bole.R
|
||||
import com.cheng.bole.bean.AttachmentBean
|
||||
import com.cheng.bole.common.Constants
|
||||
import com.cheng.bole.databinding.DialogDownloadAttachmentBinding
|
||||
import com.cheng.bole.manager.DialogEnum
|
||||
import com.cheng.bole.manager.ShareManager
|
||||
import com.cheng.bole.utils.DownLoadUtils
|
||||
import com.example.base.dialog.LoadingDialog
|
||||
import com.example.base.extensions.longToast
|
||||
import com.example.base.extensions.onClick
|
||||
import com.example.base.extensions.toast
|
||||
import com.example.base.utils.DensityUtils
|
||||
import com.example.base.utils.ScreenUtils
|
||||
import com.example.base.utils.SpanUtils
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.reflect.TypeToken
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class DownloadAttachmentDialog : DialogFragment() {
|
||||
private val mAdapter by lazy { AttachmentAdapter() }
|
||||
private val attachmentList = mutableListOf<AttachmentBean>()
|
||||
|
||||
private val loadingDialog by lazy { LoadingDialog(requireContext()) }
|
||||
|
||||
private var mOnBackListener: ((DialogEnum) -> Unit)? = null //回调事件
|
||||
|
||||
lateinit var binding: DialogDownloadAttachmentBinding
|
||||
|
||||
override fun onStart() {
|
||||
super.onStart()
|
||||
val window = dialog?.window
|
||||
val windowParams = window?.attributes
|
||||
windowParams?.dimAmount = 0.7f
|
||||
windowParams?.width = (ScreenUtils.getWindowSize().x * 0.8).toInt()
|
||||
dialog?.window?.attributes = windowParams
|
||||
|
||||
}
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||
dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
|
||||
return super.onCreateView(inflater, container, savedInstanceState)
|
||||
}
|
||||
|
||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||
val view = layoutInflater.inflate(R.layout.dialog_download_attachment, null)
|
||||
|
||||
binding = DialogDownloadAttachmentBinding.bind(view)
|
||||
|
||||
binding.tvTitle.typeface = Constants.douyinsansB
|
||||
|
||||
val listStr = arguments?.getString("list")
|
||||
|
||||
if (!TextUtils.isEmpty(listStr)) {
|
||||
attachmentList.addAll(Gson().fromJson(listStr, object : TypeToken<List<AttachmentBean>>() {}.type))
|
||||
}
|
||||
binding.rvAttachment.adapter = mAdapter
|
||||
mAdapter.setList(attachmentList)
|
||||
|
||||
mAdapter.setOnItemChildClickListener { _, v, i ->
|
||||
when (v.id) {
|
||||
R.id.btn_download -> {
|
||||
download(mAdapter.getItem(i))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
binding.ivClose.onClick {
|
||||
dismiss()
|
||||
}
|
||||
|
||||
val dialog = Dialog(requireContext())
|
||||
dialog.setContentView(view)
|
||||
return dialog
|
||||
}
|
||||
|
||||
private fun download(bean: AttachmentBean) {
|
||||
loadingDialog.show()
|
||||
lifecycleScope.launch(Dispatchers.IO) {
|
||||
DownLoadUtils.getInstance()
|
||||
.setReadTimeOut(10L)
|
||||
.setDeleteWhenException(false)
|
||||
.initUrl(bean.url, null)
|
||||
.addHeader(mapOf(Pair("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0")))
|
||||
.setFilePath(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath)
|
||||
.setFileName("${bean.title}.${bean.type}")
|
||||
.setActionCallBack(
|
||||
actionSuccess = {
|
||||
ShareManager.shareFile(requireActivity(), it)
|
||||
longToast("已下载到文件管理/内部储存/下载/${it.name}")
|
||||
loadingDialog.dismiss()
|
||||
},
|
||||
actionFail = {
|
||||
loadingDialog.dismiss()
|
||||
toast("下载失败")
|
||||
}
|
||||
).down()
|
||||
}
|
||||
}
|
||||
|
||||
fun setOnSelectListener(listener: ((DialogEnum) -> Unit)) {
|
||||
mOnBackListener = listener
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun newInstance(list: List<AttachmentBean>): DownloadAttachmentDialog {
|
||||
val arg = Bundle()
|
||||
arg.putString("list", Gson().toJson(list))
|
||||
val fragment = DownloadAttachmentDialog()
|
||||
fragment.arguments = arg
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
|
||||
inner class AttachmentAdapter : BaseQuickAdapter<AttachmentBean, BaseViewHolder>(R.layout.listitem_bid_attachment) {
|
||||
init {
|
||||
addChildClickViewIds(R.id.btn_download)
|
||||
}
|
||||
|
||||
override fun convert(holder: BaseViewHolder, item: AttachmentBean) {
|
||||
SpanUtils.with(holder.getView(R.id.tv_name))
|
||||
.appendImage(R.mipmap.ic_pdf_attachment)
|
||||
.appendSpace(DensityUtils.dp2px(8f))
|
||||
.append(item.title)
|
||||
.create()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
package com.cheng.bole.ui.dialog
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
|
|
@ -7,12 +8,27 @@ import android.view.LayoutInflater
|
|||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.PopupWindow
|
||||
import com.example.base.extensions.onClick
|
||||
import androidx.fragment.app.FragmentManager
|
||||
import com.cheng.bole.R
|
||||
import com.cheng.bole.bean.SearchOptionBean
|
||||
import com.cheng.bole.databinding.PopAboutTipBinding
|
||||
import com.cheng.bole.databinding.PopupSearchOptionsBinding
|
||||
import com.cheng.bole.ui.activity.PublicActivity
|
||||
import com.cheng.bole.ui.fragment.guide.GuideFragment
|
||||
import com.cheng.bole.ui.fragment.mine.about.AppConfigFragment
|
||||
import com.cheng.bole.ui.fragment.search.list.SearchOptionChildAdapter
|
||||
import com.cheng.bole.ui.fragment.search.list.SearchOptionParentAdapter
|
||||
import com.cheng.bole.utils.DateUtils
|
||||
import com.efs.sdk.memleaksdk.monitor.internal.bi
|
||||
import com.example.base.decoration.DividerItemDecoration
|
||||
import com.example.base.extensions.getColor
|
||||
import com.example.base.extensions.getYYYYMMDD
|
||||
import com.example.base.extensions.gone
|
||||
import com.example.base.extensions.onClick
|
||||
import com.example.base.extensions.toast
|
||||
import com.example.base.extensions.visible
|
||||
import com.example.base.utils.DensityUtils
|
||||
import java.util.Calendar
|
||||
|
||||
object PopupDialog {
|
||||
|
||||
|
|
@ -39,4 +55,338 @@ object PopupDialog {
|
|||
val height = context.resources.displayMetrics.heightPixels - y
|
||||
popWindow.showAsDropDown(v, 0, 0)
|
||||
}
|
||||
|
||||
fun showSearchAreaOptions(context: Context, v: View, cityList: List<SearchOptionBean.OptionItem>, onDismiss: () -> Unit, callback: (List<SearchOptionBean.OptionItem>) -> Unit) {
|
||||
val view = LayoutInflater.from(context).inflate(R.layout.popup_search_options, null, false)
|
||||
val binding = PopupSearchOptionsBinding.bind(view)
|
||||
|
||||
val parentAdapter = SearchOptionParentAdapter()
|
||||
binding.rvParent.adapter = parentAdapter
|
||||
|
||||
val childAdapter = SearchOptionChildAdapter(true)
|
||||
binding.rvChild.adapter = childAdapter
|
||||
|
||||
val optionList = SearchOptionBean.getAreaOptionList()
|
||||
if (cityList.isNotEmpty()) {
|
||||
optionList[0].isChecked = false
|
||||
optionList[0].items[0].isChecked = false
|
||||
optionList.forEach { option ->
|
||||
option.items.forEach { item ->
|
||||
if (cityList.find { it.id == item.id } != null) {
|
||||
item.isChecked = true
|
||||
if (optionList.find { it.isChecked } == null) {
|
||||
option.isChecked = true
|
||||
}
|
||||
}
|
||||
}
|
||||
val selectedList = option.items.filter { item -> item.id != 0 }
|
||||
if (selectedList.isNotEmpty() && selectedList.all { item -> item.isChecked }) {
|
||||
option.isChecked = true
|
||||
option.items[0].isChecked = true
|
||||
}
|
||||
}
|
||||
} else {
|
||||
optionList[0].isChecked = true
|
||||
optionList[0].items[0].isChecked = true
|
||||
}
|
||||
parentAdapter.setList(optionList)
|
||||
childAdapter.setList(optionList.find { it.isChecked }?.items)
|
||||
|
||||
parentAdapter.setOnItemClickListener { _, _, i ->
|
||||
val item = parentAdapter.getItem(i)
|
||||
parentAdapter.data.find { it.isChecked }?.isChecked = false
|
||||
item.isChecked = true
|
||||
parentAdapter.notifyDataSetChanged()
|
||||
|
||||
childAdapter.setList(item.items)
|
||||
}
|
||||
|
||||
childAdapter.setOnItemClickListener { _, _, i ->
|
||||
val item = childAdapter.getItem(i)
|
||||
item.isChecked = !item.isChecked
|
||||
if (item.isChecked) {
|
||||
if (item.id == 0) {
|
||||
childAdapter.data.forEach { it.isChecked = true }
|
||||
} else {
|
||||
if (childAdapter.data.filter { it.id != 0 }.all { it.isChecked }) {
|
||||
childAdapter.data[0].isChecked = true
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (item.id == 0) {
|
||||
childAdapter.data.forEach { it.isChecked = false }
|
||||
} else {
|
||||
if (childAdapter.data[0].isChecked) {
|
||||
childAdapter.data[0].isChecked = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (parentAdapter.data[0].isChecked) {
|
||||
for (i in 1 until parentAdapter.data.size) {
|
||||
parentAdapter.getItem(i).items.forEach {
|
||||
it.isChecked = false
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (parentAdapter.data[0].items[0].isChecked) {
|
||||
parentAdapter.data[0].items[0].isChecked = false
|
||||
}
|
||||
}
|
||||
|
||||
childAdapter.notifyDataSetChanged()
|
||||
}
|
||||
|
||||
val popWindow = PopupWindow(view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true)
|
||||
popWindow.isClippingEnabled = false
|
||||
popWindow.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
|
||||
popWindow.setOnDismissListener {
|
||||
onDismiss.invoke()
|
||||
}
|
||||
|
||||
binding.btnReset.onClick { parentAdapter.setList(SearchOptionBean.getAreaOptionList()) }
|
||||
|
||||
binding.btnNext.onClick {
|
||||
val list = mutableListOf<SearchOptionBean.OptionItem>()
|
||||
parentAdapter.data.forEachIndexed { index, option ->
|
||||
if (index != 0) {
|
||||
list.addAll(option.items.filter { it.isChecked && it.id != 0 })
|
||||
}
|
||||
}
|
||||
if (!parentAdapter.data[0].items[0].isChecked && list.isEmpty()) {
|
||||
toast("请选择地区")
|
||||
return@onClick
|
||||
}
|
||||
callback.invoke(list)
|
||||
popWindow.dismiss()
|
||||
}
|
||||
|
||||
val location = IntArray(2)
|
||||
v.getLocationOnScreen(location)
|
||||
popWindow.showAsDropDown(v, 0, 0)
|
||||
}
|
||||
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
fun showSearchTimeOptions(context: Context, v: View, manager: FragmentManager, time: SearchOptionBean.OptionItem?, onDismiss: () -> Unit, callback: (SearchOptionBean.OptionItem) -> Unit) {
|
||||
val view = LayoutInflater.from(context).inflate(R.layout.popup_search_options, null, false)
|
||||
val binding = PopupSearchOptionsBinding.bind(view)
|
||||
|
||||
binding.rvParent.gone()
|
||||
binding.layoutCustomTime.visible()
|
||||
|
||||
var startTime = 0L
|
||||
var endTime = 0L
|
||||
|
||||
val adapter = SearchOptionChildAdapter(false)
|
||||
binding.rvChild.adapter = adapter
|
||||
binding.rvChild.addItemDecoration(DividerItemDecoration(DensityUtils.dp2px(16f), DensityUtils.dp2px(16f), color = getColor(R.color.color_eeeeee)))
|
||||
|
||||
val optionList = SearchOptionBean.getTimeOptionList()[0]
|
||||
if (time != null) {
|
||||
if (time.id == -1) {
|
||||
optionList.items[0].isChecked = false
|
||||
} else {
|
||||
optionList.items.forEach {
|
||||
it.isChecked = it.id == time.id
|
||||
}
|
||||
}
|
||||
if (time.id != 0) {
|
||||
startTime = time.startTime.toLong() * 1000
|
||||
endTime = time.endTime.toLong() * 1000
|
||||
binding.tvStartTime.text = startTime.getYYYYMMDD()
|
||||
binding.tvEndTime.text = endTime.getYYYYMMDD()
|
||||
}
|
||||
}
|
||||
adapter.setList(optionList.items)
|
||||
|
||||
val popWindow = PopupWindow(view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true)
|
||||
popWindow.isClippingEnabled = false
|
||||
popWindow.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
|
||||
popWindow.setOnDismissListener {
|
||||
onDismiss.invoke()
|
||||
}
|
||||
|
||||
adapter.setOnItemClickListener { _, _, i ->
|
||||
val item = adapter.getItem(i)
|
||||
adapter.data.find { it.isChecked }?.isChecked = false
|
||||
item.isChecked = true
|
||||
adapter.notifyDataSetChanged()
|
||||
|
||||
if (item.id == 0) {
|
||||
startTime = 0L
|
||||
endTime = 0L
|
||||
binding.tvStartTime.text = ""
|
||||
binding.tvEndTime.text = ""
|
||||
} else {
|
||||
val calendar = Calendar.getInstance()
|
||||
when(item.id) {
|
||||
1-> calendar.add(Calendar.DATE, -2)
|
||||
2-> calendar.add(Calendar.DATE, -6)
|
||||
3-> calendar.add(Calendar.MONTH, -1)
|
||||
4-> calendar.add(Calendar.MONTH, -3)
|
||||
5-> calendar.add(Calendar.YEAR, -1)
|
||||
}
|
||||
startTime = DateUtils.getDayStartTime(calendar.timeInMillis) * 1000
|
||||
endTime = DateUtils.getDayEndTime() * 1000
|
||||
binding.tvStartTime.text = startTime.getYYYYMMDD()
|
||||
binding.tvEndTime.text = endTime.getYYYYMMDD()
|
||||
}
|
||||
}
|
||||
|
||||
binding.tvStartTime.onClick {
|
||||
val f = DatePickerDialog.newInstance("开始时间")
|
||||
f.setOnSelectListener {
|
||||
startTime = DateUtils.getDayStartTime(it) * 1000
|
||||
if (endTime in 1..<startTime) {
|
||||
toast("开始时间不能大于结束时间")
|
||||
} else {
|
||||
binding.tvStartTime.text = it.getYYYYMMDD()
|
||||
optionList.items.find { item -> item.isChecked }?.isChecked = false
|
||||
adapter.notifyDataSetChanged()
|
||||
}
|
||||
}
|
||||
f.show(manager, DatePickerDialog::class.java.simpleName)
|
||||
}
|
||||
|
||||
binding.tvEndTime.onClick {
|
||||
val f = DatePickerDialog.newInstance("结束时间")
|
||||
f.setOnSelectListener {
|
||||
endTime = DateUtils.getDayEndTime(it) * 1000
|
||||
if (endTime < startTime) {
|
||||
toast("结束时间不能小于开始时间")
|
||||
} else {
|
||||
binding.tvEndTime.text = it.getYYYYMMDD()
|
||||
optionList.items.find { item -> item.isChecked }?.isChecked = false
|
||||
adapter.notifyDataSetChanged()
|
||||
}
|
||||
}
|
||||
f.show(manager, DatePickerDialog::class.java.simpleName)
|
||||
}
|
||||
|
||||
binding.btnReset.onClick {
|
||||
startTime = 0
|
||||
endTime = 0
|
||||
binding.tvStartTime.text = ""
|
||||
binding.tvEndTime.text = ""
|
||||
|
||||
adapter.setList(SearchOptionBean.getTimeOptionList()[0].items)
|
||||
}
|
||||
|
||||
binding.btnNext.onClick {
|
||||
var option = adapter.data.find { it.isChecked }
|
||||
if (option != null) {
|
||||
option.startTime = if (option.id == 0) "" else "${startTime / 1000}"
|
||||
option.endTime = if (option.id == 0) "" else "${endTime / 1000}"
|
||||
} else {
|
||||
if (startTime == 0L) {
|
||||
toast("请选择开始时间")
|
||||
return@onClick
|
||||
}
|
||||
if (endTime == 0L) {
|
||||
toast("请选择结束时间")
|
||||
return@onClick
|
||||
}
|
||||
option = SearchOptionBean.OptionItem(-1, startTime = "${startTime / 1000}", endTime = "${endTime / 1000}")
|
||||
}
|
||||
callback.invoke(option)
|
||||
popWindow.dismiss()
|
||||
}
|
||||
|
||||
val location = IntArray(2)
|
||||
v.getLocationOnScreen(location)
|
||||
popWindow.showAsDropDown(v, 0, 0)
|
||||
}
|
||||
|
||||
fun showSearchSortOptions(context: Context, v: View, sort: SearchOptionBean.OptionItem?, onDismiss: () -> Unit, callback: (SearchOptionBean.OptionItem) -> Unit) {
|
||||
val view = LayoutInflater.from(context).inflate(R.layout.popup_search_options, null, false)
|
||||
val binding = PopupSearchOptionsBinding.bind(view)
|
||||
|
||||
binding.rvParent.gone()
|
||||
|
||||
val adapter = SearchOptionChildAdapter(false)
|
||||
binding.rvChild.adapter = adapter
|
||||
binding.rvChild.addItemDecoration(DividerItemDecoration(DensityUtils.dp2px(16f), DensityUtils.dp2px(16f), color = getColor(R.color.color_eeeeee)))
|
||||
|
||||
val optionList = SearchOptionBean.getSortOptionList()[0]
|
||||
if (sort != null) {
|
||||
optionList.items.forEach {
|
||||
it.isChecked = it.id == sort.id
|
||||
}
|
||||
}
|
||||
adapter.setList(optionList.items)
|
||||
|
||||
val popWindow = PopupWindow(view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true)
|
||||
popWindow.isClippingEnabled = false
|
||||
popWindow.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
|
||||
popWindow.setOnDismissListener {
|
||||
onDismiss.invoke()
|
||||
}
|
||||
|
||||
adapter.setOnItemClickListener { _, _, i ->
|
||||
val item = adapter.getItem(i)
|
||||
adapter.data.find { it.isChecked }?.isChecked = false
|
||||
item.isChecked = true
|
||||
adapter.notifyDataSetChanged()
|
||||
}
|
||||
|
||||
binding.btnReset.onClick { adapter.setList(SearchOptionBean.getSortOptionList()[0].items) }
|
||||
|
||||
binding.btnNext.onClick {
|
||||
val option = adapter.data.find { it.isChecked }
|
||||
if (option != null) {
|
||||
callback.invoke(option)
|
||||
popWindow.dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
val location = IntArray(2)
|
||||
v.getLocationOnScreen(location)
|
||||
popWindow.showAsDropDown(v, 0, 0)
|
||||
}
|
||||
|
||||
fun showSearchTypeOptions(context: Context, v: View, typeList: List<SearchOptionBean.OptionItem>, onDismiss: () -> Unit, callback: (List<SearchOptionBean.OptionItem>) -> Unit) {
|
||||
val view = LayoutInflater.from(context).inflate(R.layout.popup_search_options, null, false)
|
||||
val binding = PopupSearchOptionsBinding.bind(view)
|
||||
|
||||
binding.rvParent.gone()
|
||||
|
||||
val adapter = SearchOptionChildAdapter(false)
|
||||
binding.rvChild.adapter = adapter
|
||||
binding.rvChild.addItemDecoration(DividerItemDecoration(DensityUtils.dp2px(16f), DensityUtils.dp2px(16f), color = getColor(R.color.color_eeeeee)))
|
||||
|
||||
val optionList = SearchOptionBean.getTypeOptionList()[0]
|
||||
if (typeList.isNotEmpty()) {
|
||||
optionList.items.forEach { item ->
|
||||
if (typeList.find { it.id == item.id } != null) {
|
||||
item.isChecked = true
|
||||
}
|
||||
}
|
||||
}
|
||||
adapter.setList(optionList.items)
|
||||
|
||||
val popWindow = PopupWindow(view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true)
|
||||
popWindow.isClippingEnabled = false
|
||||
popWindow.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
|
||||
popWindow.setOnDismissListener {
|
||||
onDismiss.invoke()
|
||||
}
|
||||
|
||||
adapter.setOnItemClickListener { _, _, i ->
|
||||
val item = adapter.getItem(i)
|
||||
item.isChecked = !item.isChecked
|
||||
adapter.notifyDataSetChanged()
|
||||
}
|
||||
|
||||
binding.btnReset.onClick { adapter.setList(SearchOptionBean.getTypeOptionList()[0].items) }
|
||||
|
||||
binding.btnNext.onClick {
|
||||
val list = adapter.data.filter { it.isChecked }
|
||||
callback.invoke(list)
|
||||
popWindow.dismiss()
|
||||
}
|
||||
|
||||
val location = IntArray(2)
|
||||
v.getLocationOnScreen(location)
|
||||
popWindow.showAsDropDown(v, 0, 0)
|
||||
}
|
||||
}
|
||||
|
|
@ -143,7 +143,7 @@ class UpdateVersionDialog : DialogFragment() {
|
|||
lifecycleScope.launch(Dispatchers.IO) {
|
||||
var totalProgress = 0L
|
||||
DownLoadUtils.getInstance()
|
||||
.setReadTImeOut(10L)
|
||||
.setReadTimeOut(10L)
|
||||
.setDeleteWhenException(false)
|
||||
.initUrl(url, null)
|
||||
.setFilePath(com.cheng.bole.utils.FileUtils.getInstance().cacheDownLoderDir.absolutePath)
|
||||
|
|
|
|||
|
|
@ -1,10 +1,11 @@
|
|||
package com.cheng.bole.ui.fragment.home
|
||||
package com.cheng.bole.ui.fragment.bid
|
||||
|
||||
import android.text.Html
|
||||
import android.text.TextUtils
|
||||
import com.chad.library.adapter.base.viewholder.BaseViewHolder
|
||||
import com.cheng.bole.R
|
||||
import com.cheng.bole.bean.BidItemBean
|
||||
import com.cheng.bole.utils.BidTypeUtils
|
||||
import com.cheng.bole.widget.CommonShapeView
|
||||
import com.example.base.ui.list.LoadMoreAdapter
|
||||
import java.text.DecimalFormat
|
||||
|
|
@ -13,7 +14,8 @@ class BidAdapter(private val showTipsTime: Boolean = false) : LoadMoreAdapter<Bi
|
|||
|
||||
override fun convert(holder: BaseViewHolder, item: BidItemBean) {
|
||||
val tvTag = holder.getView<CommonShapeView>(R.id.tv_tag)
|
||||
tvTag.setBgColor(item.getTypeColor())
|
||||
tvTag.setBgColor(BidTypeUtils.getTypeColor(item.typeName))
|
||||
tvTag.text = BidTypeUtils.getShortName(item.typeName)
|
||||
|
||||
holder.setText(R.id.tv_title, Html.fromHtml(item.title, Html.FROM_HTML_MODE_LEGACY))
|
||||
holder.setText(R.id.tv_content, Html.fromHtml(item.content, Html.FROM_HTML_MODE_LEGACY))
|
||||
|
|
@ -0,0 +1,202 @@
|
|||
package com.cheng.bole.ui.fragment.bid.detail
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.text.TextUtils
|
||||
import android.util.Base64
|
||||
import android.webkit.WebResourceRequest
|
||||
import android.webkit.WebView
|
||||
import android.webkit.WebViewClient
|
||||
import com.cheng.bole.R
|
||||
import com.cheng.bole.bean.BidDetailBean
|
||||
import com.cheng.bole.bean.UploadFileBean
|
||||
import com.cheng.bole.bean.WxShareEntity
|
||||
import com.cheng.bole.common.Constants
|
||||
import com.cheng.bole.common.EventConstants
|
||||
import com.cheng.bole.databinding.FragmentBidDetailBinding
|
||||
import com.cheng.bole.event.FavoriteEvent
|
||||
import com.cheng.bole.manager.EventReportManager
|
||||
import com.cheng.bole.manager.ShareManager
|
||||
import com.cheng.bole.manager.UserConfigManager
|
||||
import com.cheng.bole.ui.dialog.DownloadAttachmentDialog
|
||||
import com.cheng.bole.utils.BidTypeUtils
|
||||
import com.example.base.browser.BrowserActivity
|
||||
import com.example.base.common.RxBus
|
||||
import com.example.base.extensions.getColor
|
||||
import com.example.base.extensions.gone
|
||||
import com.example.base.extensions.onClick
|
||||
import com.example.base.extensions.toast
|
||||
import com.example.base.extensions.visible
|
||||
import com.example.base.ui.BaseFragment
|
||||
import com.example.base.utils.ClipboardUtils
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.reflect.TypeToken
|
||||
import com.tencent.mm.opensdk.openapi.IWXAPI
|
||||
import com.tencent.mm.opensdk.openapi.WXAPIFactory
|
||||
import com.umeng.socialize.bean.SHARE_MEDIA
|
||||
|
||||
class BidDetailFragment: BaseFragment<FragmentBidDetailBinding, BidDetailViewModel>() {
|
||||
private lateinit var api: IWXAPI
|
||||
private val id by lazy { arguments?.getString("id") ?: "" }
|
||||
private val infoSource by lazy { arguments?.getString("info_source") ?: "" }
|
||||
|
||||
private val contactsAdapter by lazy { ContactsAdapter() }
|
||||
private val imageAdapter by lazy { BidImageAdapter() }
|
||||
|
||||
private var detail: BidDetailBean? = null
|
||||
|
||||
private var isFavorite: Boolean = false
|
||||
|
||||
override fun initView() {
|
||||
super.initView()
|
||||
binding.rvContacts.adapter = contactsAdapter
|
||||
|
||||
binding.rvImage.adapter = imageAdapter
|
||||
|
||||
initWebView()
|
||||
}
|
||||
|
||||
private fun initWebView() {
|
||||
val settings = binding.webView.settings
|
||||
settings.useWideViewPort = true
|
||||
settings.loadWithOverviewMode = true
|
||||
|
||||
binding.webView.isVerticalScrollBarEnabled = false
|
||||
binding.webView.isHorizontalScrollBarEnabled = false
|
||||
binding.webView.setWebViewClient(object : WebViewClient() {
|
||||
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
|
||||
return true
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
override fun initData() {
|
||||
super.initData()
|
||||
api = WXAPIFactory.createWXAPI(requireContext(), Constants.WechatAppId)
|
||||
mViewModel.getBidDetail(id, infoSource)
|
||||
mViewModel.sendAuth()
|
||||
EventReportManager.eventReport(EventConstants.JUMP_TO_BID_DETAIL, "", "{\"id\": $id}")
|
||||
}
|
||||
|
||||
override fun initListener() {
|
||||
super.initListener()
|
||||
binding.ivShare.onClick {
|
||||
if (!api.isWXAppInstalled) {
|
||||
toast("您没有安装微信客户端,请先下载安装")
|
||||
return@onClick
|
||||
}
|
||||
val shareEntity = WxShareEntity()
|
||||
shareEntity.title = detail!!.origin_title
|
||||
shareEntity.link = UserConfigManager.getShareEntity()?.link ?: detail!!.share_url
|
||||
shareEntity.content = UserConfigManager.getShareEntity()?.content ?: ""
|
||||
ShareManager.shareUrl(requireActivity(), SHARE_MEDIA.WEIXIN, shareEntity) {}
|
||||
}
|
||||
|
||||
binding.ivDownload.onClick {
|
||||
if (detail!!.origin_attachment.isNotEmpty()) {
|
||||
val f = DownloadAttachmentDialog.newInstance(detail!!.origin_attachment)
|
||||
f.show(childFragmentManager, DownloadAttachmentDialog::class.java.simpleName)
|
||||
} else {
|
||||
toast("不可下载")
|
||||
}
|
||||
}
|
||||
|
||||
binding.ivFavorite.onClick {
|
||||
if (!isFavorite) {
|
||||
mViewModel.favorite(detail!!.id, detail!!.info_source)
|
||||
} else {
|
||||
mViewModel.favoriteCancel(detail!!.id)
|
||||
}
|
||||
}
|
||||
|
||||
binding.ivView.onClick {
|
||||
BrowserActivity.start(requireContext(), "原文", detail!!.origin_url, true)
|
||||
ClipboardUtils.copyText(detail!!.origin_url)
|
||||
toast("原文链接已复制")
|
||||
}
|
||||
|
||||
contactsAdapter.setOnItemChildClickListener { _, view, i ->
|
||||
val item = contactsAdapter.getItem(i)
|
||||
when(view.id) {
|
||||
R.id.iv_call -> {
|
||||
val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:${item.phone}"))
|
||||
startActivity(intent)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
override fun initObserve() {
|
||||
super.initObserve()
|
||||
mViewModel.detailLiveData.observe(this) {
|
||||
detail = it
|
||||
setData()
|
||||
}
|
||||
|
||||
mViewModel.favoriteLiveData.observe(this) {
|
||||
isFavorite = true
|
||||
setFavoriteStyle()
|
||||
RxBus.defaultInstance.post(FavoriteEvent())
|
||||
toast("收藏成功")
|
||||
}
|
||||
|
||||
mViewModel.cancelLiveData.observe(this) {
|
||||
isFavorite = false
|
||||
setFavoriteStyle()
|
||||
RxBus.defaultInstance.post(FavoriteEvent())
|
||||
toast("取消收藏")
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("SetJavaScriptEnabled")
|
||||
private fun setData() {
|
||||
if (detail != null) {
|
||||
binding.tvTitle.text = detail!!.origin_title
|
||||
binding.tvTag.text = BidTypeUtils.getShortName(detail!!.type_name)
|
||||
binding.tvTag.setBgColor(BidTypeUtils.getTypeColor(detail!!.type_name))
|
||||
binding.tvAmount.text = detail!!.project_amount
|
||||
binding.tvTime.text = detail!!.tips_time
|
||||
contactsAdapter.setList(detail!!.contact)
|
||||
|
||||
if (TextUtils.isEmpty(detail!!.content_type) || detail!!.content_type == "1") {
|
||||
val encodedHtml: String = Base64.encodeToString(detail!!.origin_content.toString().toByteArray(), Base64.NO_PADDING)
|
||||
binding.webView.loadData(encodedHtml,"text/html","base64")
|
||||
binding.webView.visible()
|
||||
binding.rvImage.gone()
|
||||
} else {
|
||||
val imageList = Gson().fromJson<List<UploadFileBean>>(Gson().toJson(detail!!.origin_content), object : TypeToken<List<UploadFileBean>>() {}.type)
|
||||
imageAdapter.setList(imageList)
|
||||
binding.rvImage.visible()
|
||||
binding.webView.gone()
|
||||
}
|
||||
|
||||
isFavorite = detail!!.is_fav
|
||||
setFavoriteStyle()
|
||||
|
||||
if (TextUtils.isEmpty(detail?.project_amount)) {
|
||||
binding.tvAmount.gone()
|
||||
}
|
||||
if (detail!!.contact.isEmpty()) {
|
||||
binding.layoutContacts.gone()
|
||||
}
|
||||
if (detail!!.origin_attachment.isEmpty()) {
|
||||
binding.ivDownload.setImageResource(R.mipmap.ic_bid_download_disable)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun setFavoriteStyle() {
|
||||
if (isFavorite) {
|
||||
binding.ivFavorite.setImageResource(R.mipmap.ic_bid_favorited)
|
||||
} else {
|
||||
binding.ivFavorite.setImageResource(R.mipmap.ic_bid_favorite)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
binding.webView.destroy()
|
||||
super.onDestroyView()
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
package com.cheng.bole.ui.fragment.bid.detail
|
||||
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import com.cheng.bole.bean.BidDetailBean
|
||||
import com.cheng.bole.net.ApiFactory
|
||||
import com.example.base.extensions.toast
|
||||
import com.example.base.utils.L
|
||||
import com.example.base.viewmodel.BaseViewModel
|
||||
import com.google.gson.JsonObject
|
||||
import okhttp3.RequestBody.Companion.toRequestBody
|
||||
|
||||
class BidDetailViewModel: BaseViewModel() {
|
||||
val detailLiveData = MutableLiveData<BidDetailBean>()
|
||||
val favoriteLiveData = MutableLiveData<Any>()
|
||||
val cancelLiveData = MutableLiveData<Any>()
|
||||
|
||||
fun getBidDetail(id: String, infoSource: String) {
|
||||
showDialog()
|
||||
launchOnUiTryCatch({
|
||||
val response = ApiFactory.apiService.getBidDetail(id, "recommend", infoSource)
|
||||
if (response.status) {
|
||||
detailLiveData.postValue(response.data)
|
||||
} else toast(response.message, true)
|
||||
dismissDialog()
|
||||
}, {
|
||||
dismissDialog()
|
||||
setError(it)
|
||||
L.d(it)
|
||||
})
|
||||
}
|
||||
|
||||
fun favorite(id: String, infoSource: String) {
|
||||
showDialog()
|
||||
launchOnUiTryCatch({
|
||||
val jsonObject = JsonObject()
|
||||
jsonObject.addProperty("infoId", id)
|
||||
jsonObject.addProperty("infoSource",infoSource)
|
||||
val response = ApiFactory.apiService.favorite(jsonObject.toString().toRequestBody())
|
||||
if (response.status) {
|
||||
favoriteLiveData.postValue(Any())
|
||||
}
|
||||
dismissDialog()
|
||||
}, {
|
||||
dismissDialog()
|
||||
setError(it)
|
||||
L.d(it)
|
||||
})
|
||||
}
|
||||
|
||||
fun favoriteCancel(id: String) {
|
||||
showDialog()
|
||||
launchOnUiTryCatch({
|
||||
val response = ApiFactory.apiService.favoriteCancel(id)
|
||||
if (response.status) {
|
||||
cancelLiveData.postValue(Any())
|
||||
}
|
||||
dismissDialog()
|
||||
}, {
|
||||
dismissDialog()
|
||||
setError(it)
|
||||
L.d(it)
|
||||
})
|
||||
}
|
||||
|
||||
fun sendAuth() {
|
||||
launchOnUiTryCatch({
|
||||
val jsonObject = JsonObject()
|
||||
jsonObject.addProperty("scene", "info")
|
||||
jsonObject.addProperty("count", 1)
|
||||
ApiFactory.apiService.sendAuth(jsonObject.toString().toRequestBody())
|
||||
}, {
|
||||
L.d(it)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
package com.cheng.bole.ui.fragment.bid.detail
|
||||
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.drawable.Drawable
|
||||
import com.bumptech.glide.Glide
|
||||
import com.bumptech.glide.request.target.CustomTarget
|
||||
import com.bumptech.glide.request.transition.Transition
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter
|
||||
import com.chad.library.adapter.base.viewholder.BaseViewHolder
|
||||
import com.cheng.bole.R
|
||||
import com.cheng.bole.bean.UploadFileBean
|
||||
import com.cheng.bole.utils.BitmapUtils
|
||||
|
||||
class BidImageAdapter: BaseQuickAdapter<UploadFileBean, BaseViewHolder>(R.layout.listitem_bid_detail_image) {
|
||||
override fun convert(holder: BaseViewHolder, item: UploadFileBean) {
|
||||
Glide.with(context)
|
||||
.asBitmap()
|
||||
.load(item.url)
|
||||
.into(object : CustomTarget<Bitmap>() {
|
||||
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
|
||||
val scale = recyclerView.width / resource.width
|
||||
val bitmap = BitmapUtils.resizeBitmap(resource, recyclerView.width, resource.height * scale )
|
||||
holder.setImageBitmap(R.id.iv_image, bitmap)
|
||||
}
|
||||
|
||||
override fun onLoadCleared(placeholder: Drawable?) {
|
||||
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
package com.cheng.bole.ui.fragment.bid.detail
|
||||
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter
|
||||
import com.chad.library.adapter.base.viewholder.BaseViewHolder
|
||||
import com.cheng.bole.R
|
||||
import com.cheng.bole.bean.ContactsInfoBean
|
||||
|
||||
class ContactsAdapter: BaseQuickAdapter<ContactsInfoBean, BaseViewHolder>(R.layout.listitem_bid_detail_contact) {
|
||||
init {
|
||||
addChildClickViewIds(R.id.iv_call)
|
||||
}
|
||||
|
||||
override fun convert(holder: BaseViewHolder, item: ContactsInfoBean) {
|
||||
holder.setText(R.id.tv_name, item.name)
|
||||
holder.setText(R.id.tv_phone, item.phone)
|
||||
}
|
||||
}
|
||||
|
|
@ -2,20 +2,28 @@ package com.cheng.bole.ui.fragment.home
|
|||
|
||||
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
import androidx.recyclerview.widget.RecyclerView.HORIZONTAL
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter
|
||||
import com.chad.library.adapter.base.viewholder.BaseViewHolder
|
||||
import com.cheng.bole.R
|
||||
import com.cheng.bole.bean.BidItemBean
|
||||
import com.cheng.bole.bean.MenuEntity
|
||||
import com.cheng.bole.common.Constants
|
||||
import com.cheng.bole.common.EventConstants
|
||||
import com.cheng.bole.databinding.FragmentHomeBinding
|
||||
import com.efs.sdk.memleaksdk.monitor.internal.bi
|
||||
import com.cheng.bole.manager.EventReportManager
|
||||
import com.cheng.bole.manager.SearchHistoryManager
|
||||
import com.cheng.bole.ui.activity.PublicActivity
|
||||
import com.cheng.bole.ui.fragment.bid.BidAdapter
|
||||
import com.cheng.bole.ui.fragment.bid.detail.BidDetailFragment
|
||||
import com.cheng.bole.ui.fragment.mine.vip.VipFragment
|
||||
import com.cheng.bole.ui.fragment.search.SearchFragment
|
||||
import com.cheng.bole.ui.fragment.search.list.SearchListFragment
|
||||
import com.example.base.decoration.GridSpaceItemDecoration
|
||||
import com.example.base.decoration.SpacesItemDecoration
|
||||
import com.example.base.extensions.getColor
|
||||
import com.example.base.extensions.onClick
|
||||
import com.example.base.ui.BaseFragment
|
||||
import com.example.base.ui.list.ListFragment
|
||||
import com.example.base.utils.DensityUtils
|
||||
import com.example.base.utils.L
|
||||
import com.example.base.utils.SpanUtils
|
||||
import java.text.DecimalFormat
|
||||
import kotlin.math.abs
|
||||
|
||||
|
||||
|
|
@ -31,6 +39,8 @@ class HomeFragment : ListFragment<FragmentHomeBinding, HomeViewModel, BidItemBea
|
|||
|
||||
override fun bindAdapter() = BidAdapter()
|
||||
|
||||
private var item: BidItemBean? = null
|
||||
|
||||
override fun initView() {
|
||||
super.initView()
|
||||
binding.tvTitle.typeface = Constants.pmzdbt
|
||||
|
|
@ -54,16 +64,17 @@ class HomeFragment : ListFragment<FragmentHomeBinding, HomeViewModel, BidItemBea
|
|||
|
||||
override fun initListener() {
|
||||
super.initListener()
|
||||
binding.appBarLayout.addOnOffsetChangedListener { _, verticalOffset ->
|
||||
binding.appBarLayout.addOnOffsetChangedListener { appBarLayout, verticalOffset ->
|
||||
val lp = binding.layoutContent.layoutParams as CoordinatorLayout.LayoutParams
|
||||
if (abs(verticalOffset) >= binding.appBarLayout.height - DensityUtils.dp2px(45f)) {
|
||||
lp.topMargin = (-DensityUtils.dp2px(25f) * (1f - abs(verticalOffset).toFloat() / (binding.appBarLayout.height - DensityUtils.dp2px(20f)))).toInt()
|
||||
} else {
|
||||
lp.topMargin = -DensityUtils.dp2px(65f)
|
||||
}
|
||||
lp.topMargin = (-DensityUtils.dp2px(45f) * (1f - abs(verticalOffset).toFloat() / appBarLayout.totalScrollRange)).toInt()
|
||||
binding.layoutContent.layoutParams = lp
|
||||
}
|
||||
|
||||
binding.tvSearch.onClick {
|
||||
PublicActivity.start(requireContext(), SearchFragment::class.java)
|
||||
EventReportManager.eventReport(EventConstants.JUMP_TO_BID_SEARCH)
|
||||
}
|
||||
|
||||
binding.ivRefresh.onClick {
|
||||
if (keywordAdapter.data.isNotEmpty()) {
|
||||
mViewModel.getHotKeywordList(keywordAdapter.data.last())
|
||||
|
|
@ -71,6 +82,19 @@ class HomeFragment : ListFragment<FragmentHomeBinding, HomeViewModel, BidItemBea
|
|||
mViewModel.getHotKeywordList("")
|
||||
}
|
||||
}
|
||||
|
||||
mAdapter.setOnItemClickListener { _, _, i ->
|
||||
mAdapter.setOnItemClickListener { _, _, i ->
|
||||
item = mAdapter.getItem(i)
|
||||
mViewModel.checkAuth()
|
||||
}
|
||||
}
|
||||
|
||||
keywordAdapter.setOnItemClickListener { _, _, i ->
|
||||
val item = keywordAdapter.getItem(i)
|
||||
PublicActivity.start(requireContext(), SearchListFragment::class.java,Pair("keyword", item))
|
||||
SearchHistoryManager.addHistory(item)
|
||||
}
|
||||
}
|
||||
|
||||
override fun initObserve() {
|
||||
|
|
@ -78,5 +102,27 @@ class HomeFragment : ListFragment<FragmentHomeBinding, HomeViewModel, BidItemBea
|
|||
mViewModel.recommendLiveData.observe(this) {
|
||||
keywordAdapter.setList(it)
|
||||
}
|
||||
|
||||
mViewModel.totalLiveData.observe(this) {
|
||||
SpanUtils.with(binding.tvUpdateCount)
|
||||
.append("已更新")
|
||||
.append(DecimalFormat("0.#").format(it.toInt()/ 10000f))
|
||||
.setForegroundColor(getColor(R.color.color_ff2222))
|
||||
.append("万条")
|
||||
.create()
|
||||
}
|
||||
|
||||
mViewModel.authLiveData.observe(this) {
|
||||
if (it.auth) {
|
||||
PublicActivity.start(
|
||||
requireContext(),
|
||||
BidDetailFragment::class.java,
|
||||
Pair("id", item!!.id),
|
||||
Pair("info_source", item!!.info_source)
|
||||
)
|
||||
} else {
|
||||
PublicActivity.start(requireContext(), VipFragment::class.java, Pair("origin", "view_bid"))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -11,13 +11,18 @@ import com.example.base.utils.L
|
|||
import com.example.base.viewmodel.ListViewModel
|
||||
|
||||
class HomeViewModel : ListViewModel<BidItemBean>() {
|
||||
override suspend fun requestApi(params: ArrayMap<String, String>): Result<List<BidItemBean>> {
|
||||
return ApiFactory.apiService.getRecommendList(params).toListResult()
|
||||
}
|
||||
|
||||
val totalLiveData = MutableLiveData<String>()
|
||||
val authLiveData = MutableLiveData<UserAuthBean>()
|
||||
val recommendLiveData = MutableLiveData<List<String>>()
|
||||
|
||||
override suspend fun requestApi(params: ArrayMap<String, String>): Result<List<BidItemBean>> {
|
||||
val response = ApiFactory.apiService.getRecommendList(params)
|
||||
if (response.status) {
|
||||
totalLiveData.postValue(response.data.total)
|
||||
}
|
||||
return response.toListResult()
|
||||
}
|
||||
|
||||
fun getHotKeywordList(query: String) {
|
||||
launchOnUiTryCatch({
|
||||
val params = mutableMapOf<String, String>()
|
||||
|
|
|
|||
|
|
@ -99,6 +99,9 @@ class MainFragment : BaseFragment<FragmentMainBinding, MainViewModel>() {
|
|||
override fun onResume() {
|
||||
super.onResume()
|
||||
mViewModel.userInfo()
|
||||
if (UserConfigManager.getAreaList().isEmpty()) {
|
||||
mViewModel.getAreaList()
|
||||
}
|
||||
}
|
||||
|
||||
override fun initObserve() {
|
||||
|
|
@ -121,6 +124,11 @@ class MainFragment : BaseFragment<FragmentMainBinding, MainViewModel>() {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
mViewModel.areaLiveData.observe(this) {
|
||||
UserConfigManager.saveAreaList(it)
|
||||
}
|
||||
|
||||
mViewModel.getCouponLiveData.observe(this) {
|
||||
toast("领取成功")
|
||||
PublicActivity.start(requireContext(), CouponFragment::class.java)
|
||||
|
|
|
|||
|
|
@ -1,15 +1,19 @@
|
|||
package com.cheng.bole.ui.fragment.main
|
||||
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import com.cheng.bole.bean.AreaBean
|
||||
import com.cheng.bole.bean.UserEntity
|
||||
import com.cheng.bole.net.ApiFactory
|
||||
import com.example.base.extensions.toast
|
||||
import com.example.base.utils.L
|
||||
import com.example.base.viewmodel.BaseViewModel
|
||||
import com.google.gson.JsonObject
|
||||
import com.cheng.bole.net.ApiFactory
|
||||
import okhttp3.RequestBody.Companion.toRequestBody
|
||||
|
||||
class MainViewModel : BaseViewModel() {
|
||||
val userInfoLiveData = MutableLiveData<com.cheng.bole.bean.UserEntity>()
|
||||
val userInfoLiveData = MutableLiveData<UserEntity>()
|
||||
|
||||
val areaLiveData = MutableLiveData<List<AreaBean>>()
|
||||
val getCouponLiveData = MutableLiveData<Int>()
|
||||
|
||||
fun userInfo() {
|
||||
|
|
@ -24,6 +28,19 @@ class MainViewModel : BaseViewModel() {
|
|||
})
|
||||
}
|
||||
|
||||
fun getAreaList() {
|
||||
launchOnUiTryCatch({
|
||||
val response = ApiFactory.apiService.getAreaList()
|
||||
if (response.status) {
|
||||
areaLiveData.postValue(response.data)
|
||||
} else toast(response.message, true)
|
||||
}, {
|
||||
setError(it)
|
||||
L.d(it)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
fun getActivityCoupon(ids: String, type: Int) {
|
||||
showDialog()
|
||||
launchOnUiTryCatch({
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
package com.cheng.bole.ui.fragment.search
|
||||
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter
|
||||
import com.chad.library.adapter.base.viewholder.BaseViewHolder
|
||||
import com.cheng.bole.R
|
||||
|
||||
class HistoryKeywordAdapter: BaseQuickAdapter<String, BaseViewHolder>(R.layout.listitem_search_history) {
|
||||
override fun convert(holder: BaseViewHolder, item: String) {
|
||||
holder.setText(R.id.tv_name, item)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
package com.cheng.bole.ui.fragment.search
|
||||
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter
|
||||
import com.chad.library.adapter.base.viewholder.BaseViewHolder
|
||||
import com.cheng.bole.R
|
||||
|
||||
class RecommendKeywordAdapter: BaseQuickAdapter<String, BaseViewHolder>(R.layout.listitem_search_recommend) {
|
||||
override fun convert(holder: BaseViewHolder, item: String) {
|
||||
holder.setText(R.id.tv_name, item)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,165 @@
|
|||
package com.cheng.bole.ui.fragment.search
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.text.TextUtils
|
||||
import android.view.View
|
||||
import android.view.ViewTreeObserver
|
||||
import android.view.animation.RotateAnimation
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import com.cheng.bole.common.Constants
|
||||
import com.cheng.bole.databinding.FragmentSearchBinding
|
||||
import com.cheng.bole.impl.TextWatcherImpl
|
||||
import com.cheng.bole.manager.DialogEnum
|
||||
import com.cheng.bole.manager.SearchHistoryManager
|
||||
import com.cheng.bole.ui.activity.PublicActivity
|
||||
import com.cheng.bole.ui.dialog.TipDialog
|
||||
import com.cheng.bole.ui.fragment.merchant.MerchantFragment
|
||||
import com.cheng.bole.ui.fragment.search.list.SearchListFragment
|
||||
import com.example.base.extensions.gone
|
||||
import com.example.base.extensions.onClick
|
||||
import com.example.base.extensions.toast
|
||||
import com.example.base.extensions.visible
|
||||
import com.example.base.ui.BaseFragment
|
||||
import com.google.android.flexbox.FlexDirection
|
||||
import com.google.android.flexbox.FlexWrap
|
||||
import com.google.android.flexbox.FlexboxLayoutManager
|
||||
import com.google.android.flexbox.JustifyContent
|
||||
|
||||
class SearchFragment: BaseFragment<FragmentSearchBinding, SearchViewModel>() {
|
||||
private val type by lazy { arguments?.getInt("type") ?: 0 }
|
||||
|
||||
private val historyAdapter by lazy { HistoryKeywordAdapter() }
|
||||
private val recommendAdapter by lazy { RecommendKeywordAdapter() }
|
||||
|
||||
private val textWatcher = object : TextWatcherImpl() {
|
||||
@SuppressLint("SetTextI18n")
|
||||
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
|
||||
binding.ivClearText.visibility = if (TextUtils.isEmpty(s)) View.INVISIBLE else View.VISIBLE
|
||||
}
|
||||
}
|
||||
|
||||
override fun initView() {
|
||||
super.initView()
|
||||
binding.tvTitle.typeface = Constants.pmzdbt
|
||||
|
||||
val historyLayoutManager = FlexboxLayoutManager(requireContext())
|
||||
historyLayoutManager.flexDirection = FlexDirection.ROW
|
||||
historyLayoutManager.flexWrap = FlexWrap.WRAP
|
||||
historyLayoutManager.justifyContent = JustifyContent.FLEX_START
|
||||
binding.rvHistory.layoutManager = historyLayoutManager
|
||||
binding.rvHistory.adapter = historyAdapter
|
||||
|
||||
val recommendLayoutManager = FlexboxLayoutManager(requireContext())
|
||||
recommendLayoutManager.flexDirection = FlexDirection.ROW
|
||||
recommendLayoutManager.flexWrap = FlexWrap.WRAP
|
||||
recommendLayoutManager.justifyContent = JustifyContent.FLEX_START
|
||||
binding.rvRecommend.layoutManager = recommendLayoutManager
|
||||
binding.rvRecommend.adapter = recommendAdapter
|
||||
}
|
||||
|
||||
override fun initData() {
|
||||
super.initData()
|
||||
mViewModel.getHotKeywordList("")
|
||||
}
|
||||
|
||||
override fun initListener() {
|
||||
super.initListener()
|
||||
binding.ivTopBg.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
|
||||
override fun onGlobalLayout() {
|
||||
(binding.tvTitle.layoutParams as ConstraintLayout.LayoutParams).topMargin = (binding.ivTopBg.height * 100f / 300f).toInt()
|
||||
(binding.layoutSearch.layoutParams as ConstraintLayout.LayoutParams).topMargin = (binding.ivTopBg.height * 200f / 300f).toInt()
|
||||
binding.ivTopBg.viewTreeObserver.addOnGlobalLayoutListener(this)
|
||||
}
|
||||
})
|
||||
|
||||
binding.etSearch.addTextChangedListener(textWatcher)
|
||||
|
||||
binding.ivClearText.onClick {
|
||||
binding.etSearch.setText("")
|
||||
}
|
||||
|
||||
binding.btnSearch.onClick {
|
||||
val keyword = binding.etSearch.text.toString().trim()
|
||||
if (TextUtils.isEmpty(keyword)) {
|
||||
toast("请输入搜索关键词")
|
||||
return@onClick
|
||||
}
|
||||
if (type == 0) {
|
||||
PublicActivity.start(requireContext(), SearchListFragment::class.java, Pair("keyword", keyword))
|
||||
} else {
|
||||
PublicActivity.start(requireContext(), MerchantFragment::class.java, Pair("keyword", keyword))
|
||||
}
|
||||
historyAdapter.setList(SearchHistoryManager.addHistory(keyword))
|
||||
binding.layoutHistory.visible()
|
||||
}
|
||||
|
||||
binding.ivClearHistory.onClick {
|
||||
val f = TipDialog.newInstance("温馨提示", "确定清空搜索历史?")
|
||||
f.setOnSelectListener {
|
||||
if (it == DialogEnum.CLICK_OK) {
|
||||
SearchHistoryManager.clear()
|
||||
historyAdapter.setList(emptyList())
|
||||
binding.layoutHistory.gone()
|
||||
}
|
||||
}
|
||||
f.show(childFragmentManager, TipDialog::class.java.simpleName)
|
||||
}
|
||||
|
||||
binding.ivRefreshRecommend.onClick {
|
||||
startRotate()
|
||||
mViewModel.getHotKeywordList(if (recommendAdapter.data.isNotEmpty()) recommendAdapter.data.last() else "")
|
||||
}
|
||||
|
||||
historyAdapter.setOnItemClickListener { _, _, i ->
|
||||
val item = historyAdapter.getItem(i)
|
||||
if (type == 0) {
|
||||
PublicActivity.start(requireContext(), SearchListFragment::class.java, Pair("keyword", item))
|
||||
} else {
|
||||
PublicActivity.start(requireContext(), MerchantFragment::class.java, Pair("keyword", item))
|
||||
}
|
||||
binding.etSearch.setText(item)
|
||||
historyAdapter.setList(SearchHistoryManager.updateHistory(item))
|
||||
}
|
||||
|
||||
recommendAdapter.setOnItemClickListener { _, _, i ->
|
||||
val item = recommendAdapter.getItem(i)
|
||||
if (type == 0) {
|
||||
PublicActivity.start(requireContext(), SearchListFragment::class.java, Pair("keyword", item))
|
||||
} else {
|
||||
PublicActivity.start(requireContext(), MerchantFragment::class.java, Pair("keyword", item))
|
||||
}
|
||||
binding.etSearch.setText(item)
|
||||
historyAdapter.setList(SearchHistoryManager.addHistory(item))
|
||||
binding.layoutHistory.visible()
|
||||
}
|
||||
}
|
||||
|
||||
override fun initObserve() {
|
||||
super.initObserve()
|
||||
mViewModel.recommendLiveData.observe(this) {
|
||||
recommendAdapter.setList(it)
|
||||
}
|
||||
}
|
||||
|
||||
private fun startRotate() {
|
||||
if (binding.ivRefreshRecommend.animation != null) {
|
||||
binding.ivRefreshRecommend.animation.cancel()
|
||||
}
|
||||
val anim = RotateAnimation(0f, 360f, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f)
|
||||
anim.duration = 1000
|
||||
binding.ivRefreshRecommend.startAnimation(anim)
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
if (SearchHistoryManager.getHistory().isNotEmpty()) {
|
||||
historyAdapter.setList(SearchHistoryManager.getHistory())
|
||||
binding.layoutHistory.visible()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
binding.etSearch.removeTextChangedListener(textWatcher)
|
||||
super.onDestroyView()
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
package com.cheng.bole.ui.fragment.search
|
||||
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import com.cheng.bole.net.ApiFactory
|
||||
import com.example.base.extensions.toast
|
||||
import com.example.base.utils.L
|
||||
import com.example.base.viewmodel.BaseViewModel
|
||||
|
||||
class SearchViewModel: BaseViewModel() {
|
||||
val recommendLiveData = MutableLiveData<List<String>>()
|
||||
|
||||
fun getHotKeywordList(query: String) {
|
||||
showDialog()
|
||||
launchOnUiTryCatch({
|
||||
val params = mutableMapOf<String, String>()
|
||||
params["query"] = query
|
||||
params["size"] = "12"
|
||||
val response = ApiFactory.apiService.getHotKeywords(params)
|
||||
if (response.status) {
|
||||
recommendLiveData.postValue(response.data)
|
||||
} else toast(response.message, true)
|
||||
dismissDialog()
|
||||
}, {
|
||||
dismissDialog()
|
||||
setError(it)
|
||||
L.d(it)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,206 @@
|
|||
package com.cheng.bole.ui.fragment.search.list
|
||||
|
||||
import android.animation.ObjectAnimator
|
||||
import android.annotation.SuppressLint
|
||||
import android.text.TextUtils
|
||||
import android.view.KeyEvent
|
||||
import android.view.View
|
||||
import androidx.core.animation.addListener
|
||||
import com.cheng.bole.R
|
||||
import com.cheng.bole.bean.BidItemBean
|
||||
import com.cheng.bole.bean.SearchOptionBean
|
||||
import com.cheng.bole.databinding.FragmentSearchListBinding
|
||||
import com.cheng.bole.impl.TextWatcherImpl
|
||||
import com.cheng.bole.manager.SearchHistoryManager
|
||||
import com.cheng.bole.manager.UserConfigManager
|
||||
import com.cheng.bole.ui.activity.PublicActivity
|
||||
import com.cheng.bole.ui.dialog.PopupDialog
|
||||
import com.cheng.bole.ui.fragment.bid.BidAdapter
|
||||
import com.cheng.bole.ui.fragment.bid.detail.BidDetailFragment
|
||||
import com.cheng.bole.ui.fragment.mine.vip.VipFragment
|
||||
import com.cheng.bole.utils.KeyboardUtils
|
||||
import com.example.base.extensions.getColor
|
||||
import com.example.base.extensions.gone
|
||||
import com.example.base.extensions.onClick
|
||||
import com.example.base.extensions.toast
|
||||
import com.example.base.extensions.visible
|
||||
import com.example.base.ui.list.ListFragment
|
||||
|
||||
class SearchListFragment : ListFragment<FragmentSearchListBinding, SearchListViewModel, BidItemBean>() {
|
||||
private val keyword by lazy { arguments?.getString("keyword") ?: "" }
|
||||
private val typeId by lazy { arguments?.getString("typeId") ?: "" }
|
||||
|
||||
private val cityList = mutableListOf<SearchOptionBean.OptionItem>()
|
||||
private val typeList = mutableListOf<SearchOptionBean.OptionItem>()
|
||||
private var timeOption: SearchOptionBean.OptionItem? = null
|
||||
private var sortOption: SearchOptionBean.OptionItem? = null
|
||||
|
||||
private var item: BidItemBean? = null
|
||||
|
||||
override fun noDataClick() {
|
||||
|
||||
}
|
||||
|
||||
override fun bindAdapter() = BidAdapter(true)
|
||||
|
||||
private val textWatcher = object : TextWatcherImpl() {
|
||||
@SuppressLint("SetTextI18n")
|
||||
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
|
||||
binding.ivClearText.visibility = if (TextUtils.isEmpty(s)) View.INVISIBLE else View.VISIBLE
|
||||
}
|
||||
}
|
||||
|
||||
override fun initView() {
|
||||
super.initView()
|
||||
|
||||
mEmptyView.setNoDataLogo(R.mipmap.ic_empty_data)
|
||||
}
|
||||
|
||||
override fun initData() {
|
||||
super.initData()
|
||||
binding.etSearch.setText(keyword)
|
||||
|
||||
mViewModel.params["query"] = keyword
|
||||
mViewModel.params["sort"] = UserConfigManager.getSearchSort()
|
||||
if (!TextUtils.isEmpty(typeId)) {
|
||||
val type = UserConfigManager.getBidTypes().find { it.id == typeId }
|
||||
if (type != null) {
|
||||
typeList.add(SearchOptionBean.OptionItem(type.id.toInt(), type.name, true))
|
||||
mViewModel.params["typeId"] = typeList.map { item -> item.id }.joinToString(",")
|
||||
}
|
||||
}
|
||||
firstLoad()
|
||||
}
|
||||
|
||||
override fun initListener() {
|
||||
super.initListener()
|
||||
binding.etSearch.addTextChangedListener(textWatcher)
|
||||
|
||||
binding.etSearch.setOnEditorActionListener { _, _, event ->
|
||||
if (event != null && event.keyCode == KeyEvent.KEYCODE_ENTER && event.action == KeyEvent.ACTION_DOWN) {
|
||||
val keyword = binding.etSearch.text.toString().trim()
|
||||
if (TextUtils.isEmpty(keyword)) {
|
||||
toast("请输入搜索关键词")
|
||||
return@setOnEditorActionListener true
|
||||
}
|
||||
KeyboardUtils.hideSoftInput(requireActivity())
|
||||
SearchHistoryManager.addHistory(keyword)
|
||||
mViewModel.params["query"] = keyword
|
||||
firstLoad()
|
||||
return@setOnEditorActionListener true
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
binding.ivClearText.onClick {
|
||||
binding.etSearch.setText("")
|
||||
}
|
||||
|
||||
binding.btnArea.onClick {
|
||||
binding.btnArea.setTextColor(getColor(R.color.color_125ffe))
|
||||
binding.btnArea.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.mipmap.ic_option_arrow_up, 0)
|
||||
PopupDialog.showSearchAreaOptions(requireContext(), binding.layoutOptions, cityList, {
|
||||
binding.viewMask.gone()
|
||||
binding.btnArea.setTextColor(getColor(R.color.color_1a1a1a))
|
||||
binding.btnArea.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.mipmap.ic_option_arrow_down, 0)
|
||||
}, {
|
||||
cityList.clear()
|
||||
cityList.addAll(it)
|
||||
|
||||
mViewModel.params["cityId"] = it.map { item -> item.id }.joinToString(",")
|
||||
firstLoad()
|
||||
})
|
||||
showMask()
|
||||
}
|
||||
|
||||
binding.btnTime.onClick {
|
||||
binding.btnTime.setTextColor(getColor(R.color.color_125ffe))
|
||||
binding.btnTime.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.mipmap.ic_option_arrow_up, 0)
|
||||
PopupDialog.showSearchTimeOptions(requireContext(), binding.layoutOptions, childFragmentManager, timeOption, {
|
||||
binding.viewMask.gone()
|
||||
binding.btnTime.setTextColor(getColor(R.color.color_1a1a1a))
|
||||
binding.btnTime.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.mipmap.ic_option_arrow_down, 0)
|
||||
}, {
|
||||
timeOption = it
|
||||
mViewModel.params["start_time"] = it.startTime
|
||||
mViewModel.params["end_time"] = it.endTime
|
||||
firstLoad()
|
||||
})
|
||||
showMask()
|
||||
}
|
||||
|
||||
binding.btnSort.onClick {
|
||||
binding.btnSort.setTextColor(getColor(R.color.color_125ffe))
|
||||
binding.btnSort.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.mipmap.ic_option_arrow_up, 0)
|
||||
PopupDialog.showSearchSortOptions(requireContext(), binding.layoutOptions, sortOption, {
|
||||
binding.viewMask.gone()
|
||||
binding.btnSort.setTextColor(getColor(R.color.color_1a1a1a))
|
||||
binding.btnSort.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.mipmap.ic_option_arrow_down, 0)
|
||||
}, {
|
||||
sortOption = it
|
||||
if (it.id == 0) {
|
||||
mViewModel.params["sort"] = UserConfigManager.getSearchSort()
|
||||
} else {
|
||||
if (UserConfigManager.getSearchSort() == "issue_time DESC") {
|
||||
mViewModel.params["sort"] = "issue_time ASC"
|
||||
} else {
|
||||
mViewModel.params["sort"] = "issue_time DESC"
|
||||
}
|
||||
}
|
||||
firstLoad()
|
||||
})
|
||||
showMask()
|
||||
}
|
||||
|
||||
binding.btnType.onClick {
|
||||
binding.btnType.setTextColor(getColor(R.color.color_125ffe))
|
||||
binding.btnType.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.mipmap.ic_option_arrow_up, 0)
|
||||
PopupDialog.showSearchTypeOptions(requireContext(), binding.layoutOptions, typeList, {
|
||||
binding.viewMask.gone()
|
||||
binding.btnType.setTextColor(getColor(R.color.color_1a1a1a))
|
||||
binding.btnType.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.mipmap.ic_option_arrow_down, 0)
|
||||
}, {
|
||||
typeList.addAll(it)
|
||||
mViewModel.params["typeId"] = it.map { item -> item.id }.joinToString(",")
|
||||
firstLoad()
|
||||
})
|
||||
showMask()
|
||||
}
|
||||
|
||||
mAdapter.setOnItemClickListener { _, _, i ->
|
||||
item = mAdapter.getItem(i)
|
||||
mViewModel.checkAuth()
|
||||
}
|
||||
}
|
||||
|
||||
override fun initObserve() {
|
||||
super.initObserve()
|
||||
mViewModel.authLiveData.observe(this) {
|
||||
if (it.auth) {
|
||||
PublicActivity.start(
|
||||
requireContext(),
|
||||
BidDetailFragment::class.java,
|
||||
Pair("id", item!!.id),
|
||||
Pair("info_source", item!!.info_source)
|
||||
)
|
||||
} else {
|
||||
PublicActivity.start(requireContext(), VipFragment::class.java, Pair("origin", "view_bid"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun showMask() {
|
||||
val anim = ObjectAnimator.ofFloat(binding.viewMask, "alpha", 0f, 1f)
|
||||
anim.duration = 200
|
||||
anim.addListener(onStart = {
|
||||
binding.viewMask.visible()
|
||||
})
|
||||
anim.startDelay = 100
|
||||
anim.start()
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
binding.etSearch.removeTextChangedListener(textWatcher)
|
||||
super.onDestroyView()
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
package com.cheng.bole.ui.fragment.search.list
|
||||
|
||||
import androidx.collection.ArrayMap
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import com.cheng.bole.bean.BidItemBean
|
||||
import com.cheng.bole.bean.UserAuthBean
|
||||
import com.cheng.bole.net.ApiFactory
|
||||
import com.cheng.bole.net.model.toListResult
|
||||
import com.example.base.extensions.toast
|
||||
import com.example.base.utils.L
|
||||
import com.example.base.viewmodel.ListViewModel
|
||||
|
||||
class SearchListViewModel: ListViewModel<BidItemBean>() {
|
||||
override suspend fun requestApi(params: ArrayMap<String, String>): Result<List<BidItemBean>> {
|
||||
return ApiFactory.apiService.search(params).toListResult()
|
||||
}
|
||||
|
||||
val authLiveData = MutableLiveData<UserAuthBean>()
|
||||
|
||||
fun checkAuth() {
|
||||
launchOnUiTryCatch({
|
||||
val response = ApiFactory.apiService.checkAuth()
|
||||
if (response.status) {
|
||||
authLiveData.postValue(response.data)
|
||||
} else toast(response.message, true)
|
||||
}, {
|
||||
setError(it)
|
||||
L.d(it)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
package com.cheng.bole.ui.fragment.search.list
|
||||
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter
|
||||
import com.chad.library.adapter.base.viewholder.BaseViewHolder
|
||||
import com.cheng.bole.R
|
||||
import com.cheng.bole.bean.SearchOptionBean
|
||||
import com.example.base.extensions.getColor
|
||||
import com.example.base.utils.DensityUtils
|
||||
|
||||
class SearchOptionChildAdapter(private val hasParent: Boolean) :
|
||||
BaseQuickAdapter<SearchOptionBean.OptionItem, BaseViewHolder>(R.layout.listitem_search_option_child) {
|
||||
override fun convert(holder: BaseViewHolder, item: SearchOptionBean.OptionItem) {
|
||||
holder.setText(R.id.tv_name, item.name)
|
||||
holder.setTextColor(R.id.tv_name, if (item.isChecked) getColor(R.color.color_125ffe) else getColor(R.color.color_1a1a1a))
|
||||
holder.setVisible(R.id.iv_check, item.isChecked)
|
||||
if (hasParent) {
|
||||
holder.itemView.layoutParams.height = DensityUtils.dp2px(40f)
|
||||
holder.itemView.setPadding(DensityUtils.dp2px(30f), 0, DensityUtils.dp2px(25f), 0)
|
||||
} else {
|
||||
holder.itemView.layoutParams.height = DensityUtils.dp2px(44f)
|
||||
holder.itemView.setPadding(DensityUtils.dp2px(16f), 0, DensityUtils.dp2px(16f), 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
package com.cheng.bole.ui.fragment.search.list
|
||||
|
||||
import android.graphics.Color
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter
|
||||
import com.chad.library.adapter.base.viewholder.BaseViewHolder
|
||||
import com.cheng.bole.R
|
||||
import com.cheng.bole.bean.SearchOptionBean
|
||||
|
||||
class SearchOptionParentAdapter: BaseQuickAdapter<SearchOptionBean, BaseViewHolder>(R.layout.listitem_search_option_parent) {
|
||||
override fun convert(holder: BaseViewHolder, item: SearchOptionBean) {
|
||||
holder.setText(R.id.tv_name, item.title)
|
||||
holder.setVisible(R.id.view_tag, item.isChecked)
|
||||
holder.itemView.setBackgroundColor(if (item.isChecked) Color.WHITE else Color.TRANSPARENT)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
package com.cheng.bole.utils
|
||||
|
||||
import android.graphics.Color
|
||||
|
||||
object BidTypeUtils {
|
||||
fun getShortName(typeName: String): String {
|
||||
return when (typeName) {
|
||||
"招标计划" -> "招标"
|
||||
"采购公告" -> "采购"
|
||||
"招标公告" -> "预告"
|
||||
"合同公告" -> "合同"
|
||||
"中标公告" -> "中标"
|
||||
"竞争性磋商" -> "竞争性磋商"
|
||||
"更正公告" -> "更正"
|
||||
"终止公告" -> "终止"
|
||||
else -> "其他"
|
||||
}
|
||||
}
|
||||
|
||||
fun getTypeColor(typeName: String): Int {
|
||||
return when (typeName) {
|
||||
"招标计划" -> Color.parseColor("#2B88F9")
|
||||
"采购公告" -> Color.parseColor("#FF7344")
|
||||
"招标公告" -> Color.parseColor("#14CEB3")
|
||||
"合同公告" -> Color.parseColor("#FFA91D")
|
||||
"中标公告" -> Color.parseColor("#FF1B1B")
|
||||
"竞争性磋商" -> Color.parseColor("#0DA9FF")
|
||||
"更正公告" -> Color.parseColor("#7066FF")
|
||||
"终止公告" -> Color.parseColor("#8C9199")
|
||||
else -> Color.parseColor("#EEEEEE")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -44,7 +44,7 @@ class DownLoadUtils private constructor() {
|
|||
}
|
||||
|
||||
private var readTimeOut = 30L
|
||||
fun setReadTImeOut(read: Long): DownLoadUtils {
|
||||
fun setReadTimeOut(read: Long): DownLoadUtils {
|
||||
this.readTimeOut = read
|
||||
return this
|
||||
}
|
||||
|
|
@ -90,23 +90,24 @@ class DownLoadUtils private constructor() {
|
|||
.addInterceptor(interceptor ?: LoggingInterceptor())
|
||||
.build()
|
||||
}
|
||||
private var actionGetTotal: (total: Long) -> Unit? = { _ -> }
|
||||
private var actionProgress: (position: Long) -> Unit? = { _ -> }
|
||||
private var actionSuccess: (file: File) -> Unit? = { _ -> }
|
||||
private var actionCancel: () -> Unit? = { }
|
||||
private var actionFail: (msg: String) -> Unit? = { _ -> }
|
||||
private var actionGetTotal: ((total: Long) -> Unit)? = { _ -> }
|
||||
private var actionProgress: ((position: Long) -> Unit)? = { _ -> }
|
||||
private var actionSuccess: (file: File) -> Unit = { _ -> }
|
||||
private var actionFail: ((msg: String) -> Unit)? = { _ -> }
|
||||
private var actionCancel: (() -> Unit)? = { }
|
||||
|
||||
fun setActionCallBack(
|
||||
actionGetTotal: (total: Long) -> Unit,
|
||||
actionProgress: (position: Long) -> Unit,
|
||||
actionGetTotal: ((total: Long) -> Unit)? = null,
|
||||
actionProgress: ((position: Long) -> Unit)? = null,
|
||||
actionSuccess: (file: File) -> Unit,
|
||||
actionFail: (msg: String) -> Unit,
|
||||
actionCancel: (() -> Unit)? = null
|
||||
): DownLoadUtils {
|
||||
this.actionGetTotal = actionGetTotal
|
||||
this.actionProgress = actionProgress
|
||||
this.actionSuccess = actionSuccess
|
||||
this.actionFail = actionFail
|
||||
|
||||
this.actionCancel = actionCancel
|
||||
return this
|
||||
}
|
||||
|
||||
|
|
@ -278,7 +279,7 @@ class DownLoadUtils private constructor() {
|
|||
private fun doException(err: String) {
|
||||
runOnUiThread {
|
||||
if (downCallBack == null) {
|
||||
actionFail.invoke(err)
|
||||
actionFail?.invoke(err)
|
||||
} else {
|
||||
downCallBack?.fail(err)
|
||||
}
|
||||
|
|
@ -304,7 +305,7 @@ class DownLoadUtils private constructor() {
|
|||
private fun doGetTotal(total: Long) {
|
||||
runOnUiThread {
|
||||
if (downCallBack == null) {
|
||||
actionGetTotal.invoke(total)
|
||||
actionGetTotal?.invoke(total)
|
||||
} else {
|
||||
downCallBack?.total(total)
|
||||
}
|
||||
|
|
@ -315,7 +316,7 @@ class DownLoadUtils private constructor() {
|
|||
private fun doProgress(progress: Long) {
|
||||
runOnUiThread {
|
||||
if (downCallBack == null) {
|
||||
actionProgress.invoke(progress)
|
||||
actionProgress?.invoke(progress)
|
||||
} else {
|
||||
downCallBack?.progress(progress)
|
||||
}
|
||||
|
|
@ -325,7 +326,7 @@ class DownLoadUtils private constructor() {
|
|||
private fun doCancel() {
|
||||
runOnUiThread {
|
||||
if (downCallBack == null) {
|
||||
actionCancel.invoke()
|
||||
actionCancel?.invoke()
|
||||
} else {
|
||||
downCallBack?.cancel()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<solid android:color="@color/white" />
|
||||
<corners android:topLeftRadius="@dimen/dp_40" />
|
||||
</shape>
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<corners android:radius="@dimen/dp_6" />
|
||||
<solid android:color="#F4F8FF" />
|
||||
</shape>
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<corners android:radius="@dimen/dp_10" />
|
||||
<solid android:color="@color/color_f6f6f6" />
|
||||
</shape>
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<corners android:radius="@dimen/dp_25" />
|
||||
<solid android:color="@color/color_f6f6f6" />
|
||||
</shape>
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<corners android:radius="@dimen/dp_4" />
|
||||
<solid android:color="@color/color_f6f6f6" />
|
||||
</shape>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="@color/white" />
|
||||
<corners android:radius="@dimen/dp_10" />
|
||||
<stroke
|
||||
android:width="@dimen/dp_1"
|
||||
android:color="@color/color_125ffe" />
|
||||
</shape>
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="@color/color_125ffe" />
|
||||
<corners
|
||||
android:bottomRightRadius="@dimen/dp_2"
|
||||
android:topRightRadius="@dimen/dp_2" />
|
||||
</shape>
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="@color/white" />
|
||||
<corners
|
||||
android:bottomLeftRadius="@dimen/dp_10"
|
||||
android:bottomRightRadius="@dimen/dp_10" />
|
||||
</shape>
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="@color/white" />
|
||||
<corners
|
||||
android:topLeftRadius="@dimen/dp_16"
|
||||
android:topRightRadius="@dimen/dp_16" />
|
||||
</shape>
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout 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:background="@drawable/shape_white_top_cor16"
|
||||
android:paddingStart="@dimen/dp_12"
|
||||
android:paddingEnd="@dimen/dp_12"
|
||||
android:paddingBottom="@dimen/dp_50">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/dp_16"
|
||||
android:text=""
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_16"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_cancel"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="取消"
|
||||
android:textColor="@color/color_999999"
|
||||
android:textSize="@dimen/sp_15"
|
||||
app:layout_constraintBottom_toBottomOf="@id/tv_title"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/tv_title" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_confirm"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="确定"
|
||||
android:textColor="@color/color_125ffe"
|
||||
android:textSize="@dimen/sp_15"
|
||||
app:layout_constraintBottom_toBottomOf="@id/tv_title"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/tv_title" />
|
||||
|
||||
<com.github.gzuliyujiang.wheelpicker.widget.DateWheelLayout
|
||||
android:id="@+id/date_picker"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/dp_30"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_title" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/shape_white_cor16"
|
||||
android:paddingBottom="@dimen/dp_26">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:src="@mipmap/ic_attachment_dialog_top_bg"
|
||||
app:layout_constraintDimensionRatio="h,816:360"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/dp_20"
|
||||
android:text="下载附件(PDF)"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_17"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rv_attachment"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:maxHeight="@dimen/dp_300"
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_title"
|
||||
tools:itemCount="2"
|
||||
tools:listitem="@layout/listitem_bid_attachment" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/iv_close"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/dp_10"
|
||||
android:layout_marginEnd="@dimen/dp_10"
|
||||
android:src="@mipmap/ic_close_dialog"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
@ -0,0 +1,230 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:src="@mipmap/ic_bid_detail_top_bg"
|
||||
app:layout_constraintDimensionRatio="h,1125:984" />
|
||||
|
||||
<com.example.base.widget.TitleBar
|
||||
android:id="@+id/mTitleBar"
|
||||
style="@style/Custom.TitleBar"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:navigationIcon="@drawable/ic_back_black"
|
||||
app:title=" ">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/iv_share"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="end"
|
||||
android:layout_marginEnd="@dimen/dp_16"
|
||||
android:src="@mipmap/ic_bid_share" />
|
||||
</com.example.base.widget.TitleBar>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/dp_16"
|
||||
android:layout_marginTop="@dimen/dp_10"
|
||||
android:layout_marginEnd="@dimen/dp_16"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:text="酒钢集团榆中长虹公司2025年焊丝生产用涂层模模具业务外包"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_18"
|
||||
app:layout_constraintTop_toBottomOf="@id/mTitleBar" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/layout_info"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/dp_16"
|
||||
android:layout_marginTop="@dimen/dp_4"
|
||||
android:layout_marginEnd="@dimen/dp_16"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_title">
|
||||
|
||||
<com.cheng.bole.widget.CommonShapeView
|
||||
android:id="@+id/tv_tag"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="@dimen/dp_18"
|
||||
android:layout_marginEnd="@dimen/dp_8"
|
||||
android:paddingStart="@dimen/dp_4"
|
||||
android:paddingEnd="@dimen/dp_4"
|
||||
android:text="招标"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="@dimen/sp_11"
|
||||
app:csb_cornerRadius="@dimen/dp_3"
|
||||
app:csb_fillColor="#2B88F9"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/tv_title" />
|
||||
|
||||
<com.cheng.bole.widget.CommonShapeView
|
||||
android:id="@+id/tv_location"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="@dimen/dp_18"
|
||||
android:layout_marginEnd="@dimen/dp_8"
|
||||
android:paddingStart="@dimen/dp_4"
|
||||
android:paddingEnd="@dimen/dp_4"
|
||||
android:text="全国"
|
||||
android:textColor="#585D6C"
|
||||
android:textSize="@dimen/sp_11"
|
||||
app:csb_cornerRadius="@dimen/dp_3"
|
||||
app:csb_fillColor="#F4F6FA"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_content" />
|
||||
|
||||
<com.cheng.bole.widget.CommonShapeView
|
||||
android:id="@+id/tv_amount"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="@dimen/dp_18"
|
||||
android:layout_marginEnd="@dimen/dp_8"
|
||||
android:paddingStart="@dimen/dp_4"
|
||||
android:paddingEnd="@dimen/dp_4"
|
||||
android:text="2.71万元"
|
||||
android:textColor="@color/color_ff493c"
|
||||
android:textSize="@dimen/sp_11"
|
||||
app:csb_cornerRadius="@dimen/dp_3"
|
||||
app:csb_fillColor="#1aff493c"
|
||||
app:layout_constraintStart_toEndOf="@id/tv_location"
|
||||
app:layout_constraintTop_toTopOf="@id/tv_location" />
|
||||
|
||||
<com.cheng.bole.widget.CommonShapeView
|
||||
android:id="@+id/tv_time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="@dimen/dp_18"
|
||||
android:paddingStart="@dimen/dp_4"
|
||||
android:paddingEnd="@dimen/dp_4"
|
||||
android:text="20分钟前"
|
||||
android:textColor="#22C29C"
|
||||
android:textSize="@dimen/sp_11"
|
||||
app:csb_cornerRadius="@dimen/dp_3"
|
||||
app:csb_fillColor="#E8F8F5"
|
||||
app:layout_constraintStart_toEndOf="@id/tv_amount"
|
||||
app:layout_constraintTop_toTopOf="@id/tv_amount" />
|
||||
</LinearLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/layout_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="@dimen/dp_40"
|
||||
android:background="@drawable/shape_bid_detail_bg"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/layout_info">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/layout_contacts"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/dp_16"
|
||||
android:layout_marginTop="@dimen/dp_37"
|
||||
android:layout_marginEnd="@dimen/dp_16"
|
||||
android:background="@drawable/shape_f4f8ff_cor6"
|
||||
android:orientation="vertical"
|
||||
android:paddingStart="@dimen/dp_16"
|
||||
android:paddingTop="@dimen/dp_12"
|
||||
android:paddingEnd="@dimen/dp_16"
|
||||
android:paddingBottom="@dimen/dp_12"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:text="联系人"
|
||||
android:textColor="@color/color_125ffe"
|
||||
android:textSize="@dimen/sp_14" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rv_contacts"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
tools:itemCount="2"
|
||||
tools:listitem="@layout/listitem_bid_detail_contact" />
|
||||
</LinearLayout>
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginStart="@dimen/dp_16"
|
||||
android:layout_marginTop="@dimen/dp_20"
|
||||
android:layout_marginEnd="@dimen/dp_16"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/layout_contacts">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_13" />
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
<WebView
|
||||
android:id="@+id/webView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginStart="@dimen/dp_16"
|
||||
android:layout_marginTop="@dimen/dp_20"
|
||||
android:layout_marginEnd="@dimen/dp_16"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/layout_contacts" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rv_image"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginStart="@dimen/dp_16"
|
||||
android:layout_marginTop="@dimen/dp_20"
|
||||
android:layout_marginEnd="@dimen/dp_16"
|
||||
android:visibility="gone"
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/layout_contacts"
|
||||
tools:listitem="@layout/listitem_bid_detail_image" />
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/iv_download"
|
||||
android:layout_width="@dimen/dp_60"
|
||||
android:layout_height="@dimen/dp_60"
|
||||
android:layout_marginBottom="-30dp"
|
||||
android:src="@mipmap/ic_bid_download"
|
||||
app:layout_constraintBottom_toTopOf="@id/layout_content"
|
||||
app:layout_constraintEnd_toStartOf="@id/iv_favorite" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/iv_favorite"
|
||||
android:layout_width="@dimen/dp_60"
|
||||
android:layout_height="@dimen/dp_60"
|
||||
android:layout_marginBottom="-30dp"
|
||||
android:src="@mipmap/ic_bid_favorite"
|
||||
app:layout_constraintBottom_toTopOf="@id/layout_content"
|
||||
app:layout_constraintEnd_toStartOf="@id/iv_view" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/iv_view"
|
||||
android:layout_width="@dimen/dp_60"
|
||||
android:layout_height="@dimen/dp_60"
|
||||
android:layout_marginBottom="-30dp"
|
||||
android:src="@mipmap/ic_bid_view"
|
||||
app:layout_constraintBottom_toTopOf="@id/layout_content"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
@ -3,9 +3,11 @@
|
|||
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:layout_height="match_parent"
|
||||
android:background="@color/white">
|
||||
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/layout_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
|
|
@ -112,7 +114,7 @@
|
|||
android:layout_marginTop="@dimen/dp_10"
|
||||
android:background="@drawable/shape_white_top_cor20"
|
||||
android:paddingTop="@dimen/dp_17"
|
||||
android:paddingBottom="@dimen/dp_40"
|
||||
android:paddingBottom="@dimen/dp_20"
|
||||
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_hot_title"
|
||||
app:spanCount="4"
|
||||
|
|
@ -125,7 +127,7 @@
|
|||
android:id="@+id/layout_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="-65dp"
|
||||
android:layout_marginTop="-45dp"
|
||||
android:paddingTop="@dimen/dp_45"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
|
||||
|
|
@ -183,6 +185,7 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="@dimen/dp_12"
|
||||
android:background="@color/windowBackground"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_bid_title">
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,273 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/iv_top_bg"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:src="@mipmap/ic_search_top_bg"
|
||||
app:layout_constraintDimensionRatio="h,1125:900"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/dp_24"
|
||||
android:layout_marginTop="@dimen/dp_100"
|
||||
android:text="搜索招标商机"
|
||||
android:textColor="#000511"
|
||||
android:textSize="@dimen/sp_30"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_desc"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/dp_3"
|
||||
android:text="信息领航,商机在握"
|
||||
android:textColor="#72757E"
|
||||
android:textSize="@dimen/sp_14"
|
||||
app:layout_constraintStart_toStartOf="@id/tv_title"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_title" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/layout_search"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/dp_46"
|
||||
android:layout_marginStart="@dimen/dp_16"
|
||||
android:layout_marginTop="@dimen/dp_200"
|
||||
android:layout_marginEnd="@dimen/dp_16"
|
||||
android:background="@drawable/shape_search_edit_bg"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatEditText
|
||||
android:id="@+id/et_search"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginStart="@dimen/dp_12"
|
||||
android:layout_weight="1"
|
||||
android:background="@null"
|
||||
android:drawableStart="@mipmap/ic_search"
|
||||
android:drawablePadding="@dimen/dp_8"
|
||||
android:gravity="center_vertical"
|
||||
android:hint="请搜索关键词"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textColorHint="@color/color_bcbcbc"
|
||||
android:textSize="@dimen/sp_15" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/iv_clear_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/dp_12"
|
||||
android:layout_marginEnd="@dimen/dp_12"
|
||||
android:src="@mipmap/ic_clear_text"
|
||||
android:visibility="invisible" />
|
||||
|
||||
<com.cheng.bole.widget.CommonShapeView
|
||||
android:id="@+id/btn_search"
|
||||
android:layout_width="@dimen/dp_60"
|
||||
android:layout_height="@dimen/dp_34"
|
||||
android:layout_marginEnd="@dimen/dp_6"
|
||||
android:text="搜索"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="@dimen/sp_15"
|
||||
app:csb_cornerRadius="@dimen/dp_10"
|
||||
app:csb_fillColor="@color/color_125ffe" />
|
||||
</LinearLayout>
|
||||
|
||||
<com.lihang.ShadowLayout
|
||||
android:id="@+id/layout_history"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/dp_9"
|
||||
android:layout_marginTop="@dimen/dp_13"
|
||||
android:layout_marginEnd="@dimen/dp_9"
|
||||
app:hl_cornerRadius="@dimen/dp_10"
|
||||
android:visibility="gone"
|
||||
app:hl_layoutBackground="@color/white"
|
||||
app:hl_shadowColor="#0d4a4f5b"
|
||||
app:hl_shadowLimit="@dimen/dp_7"
|
||||
app:layout_constraintTop_toBottomOf="@id/layout_search">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="@dimen/dp_12"
|
||||
android:paddingTop="@dimen/dp_16"
|
||||
android:paddingEnd="@dimen/dp_12"
|
||||
android:paddingBottom="@dimen/dp_16">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_history_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:drawableStart="@mipmap/ic_search_history"
|
||||
android:drawablePadding="@dimen/dp_4"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:gravity="center"
|
||||
android:text="历史搜索"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_16"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/iv_clear_history"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/ic_clear_history"
|
||||
app:layout_constraintBottom_toBottomOf="@id/tv_history_title"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/tv_history_title" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rv_history"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/dp_6"
|
||||
android:orientation="horizontal"
|
||||
android:overScrollMode="never"
|
||||
app:layoutManager="com.google.android.flexbox.FlexboxLayoutManager"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_history_title"
|
||||
tools:listitem="@layout/listitem_search_history" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</com.lihang.ShadowLayout>
|
||||
|
||||
<com.lihang.ShadowLayout
|
||||
android:id="@+id/layout_recommend"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/dp_9"
|
||||
android:layout_marginEnd="@dimen/dp_9"
|
||||
app:hl_cornerRadius="@dimen/dp_10"
|
||||
app:hl_layoutBackground="@color/white"
|
||||
app:hl_shadowColor="#0d4a4f5b"
|
||||
app:hl_shadowLimit="@dimen/dp_7"
|
||||
app:layout_goneMarginTop="@dimen/dp_13"
|
||||
app:layout_constraintTop_toBottomOf="@id/layout_history">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="@dimen/dp_12"
|
||||
android:paddingTop="@dimen/dp_16"
|
||||
android:paddingEnd="@dimen/dp_12"
|
||||
android:paddingBottom="@dimen/dp_16">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_recommend_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:drawableStart="@mipmap/ic_search_recommend_keyword"
|
||||
android:drawablePadding="@dimen/dp_4"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:gravity="center"
|
||||
android:text="搜索推荐"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_16"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/iv_refresh_recommend"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/ic_refresh2"
|
||||
app:layout_constraintBottom_toBottomOf="@id/tv_recommend_title"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/tv_recommend_title" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rv_recommend"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/dp_6"
|
||||
android:orientation="horizontal"
|
||||
android:overScrollMode="never"
|
||||
app:layoutManager="com.google.android.flexbox.FlexboxLayoutManager"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_recommend_title"
|
||||
tools:listitem="@layout/listitem_search_recommend" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</com.lihang.ShadowLayout>
|
||||
|
||||
<com.lihang.ShadowLayout
|
||||
android:id="@+id/layout_hot"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/dp_9"
|
||||
android:layout_marginEnd="@dimen/dp_9"
|
||||
app:hl_cornerRadius="@dimen/dp_10"
|
||||
app:hl_layoutBackground="@color/white"
|
||||
app:hl_shadowColor="#0d4a4f5b"
|
||||
app:hl_shadowLimit="@dimen/dp_7"
|
||||
app:layout_constraintTop_toBottomOf="@id/layout_recommend">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="@dimen/dp_12"
|
||||
android:paddingTop="@dimen/dp_16"
|
||||
android:paddingEnd="@dimen/dp_12"
|
||||
android:paddingBottom="@dimen/dp_16">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_hot_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:drawableStart="@mipmap/ic_search_hot_type"
|
||||
android:drawablePadding="@dimen/dp_4"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:gravity="center"
|
||||
android:text="热门类型"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_16"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rv_hot"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/dp_6"
|
||||
android:orientation="vertical"
|
||||
android:overScrollMode="never"
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_hot_title"
|
||||
tools:listitem="@layout/listitem_search_hot_type" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</com.lihang.ShadowLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
<com.example.base.widget.TitleBar
|
||||
android:id="@+id/mTitleBar"
|
||||
style="@style/Custom.TitleBar"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:navigationIcon="@drawable/ic_back_black"
|
||||
app:title=" " />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
@ -0,0 +1,161 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:background="@color/white"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<com.example.base.widget.TitleBar
|
||||
android:id="@+id/mTitleBar"
|
||||
style="@style/Custom.TitleBar"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:navigationIcon="@drawable/ic_back_black"
|
||||
app:title=" " />
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/layout_search"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?actionBarSize"
|
||||
android:layout_marginStart="@dimen/dp_50"
|
||||
android:layout_marginEnd="@dimen/dp_16"
|
||||
app:layout_constraintBottom_toBottomOf="@id/mTitleBar">
|
||||
|
||||
<androidx.appcompat.widget.LinearLayoutCompat
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/dp_36"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:background="@drawable/shape_f6f6f6_cor10"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatEditText
|
||||
android:id="@+id/et_search"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginStart="@dimen/dp_2"
|
||||
android:layout_weight="1"
|
||||
android:background="@null"
|
||||
android:drawableStart="@mipmap/ic_search"
|
||||
android:drawablePadding="@dimen/dp_8"
|
||||
android:gravity="center_vertical"
|
||||
android:hint="请输入关键词"
|
||||
android:lines="1"
|
||||
android:imeOptions="actionSearch"
|
||||
android:maxLines="1"
|
||||
android:paddingStart="@dimen/dp_14"
|
||||
android:singleLine="true"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textColorHint="@color/color_bcbcbc"
|
||||
android:textSize="@dimen/sp_14" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/iv_clear_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/dp_10"
|
||||
android:layout_marginEnd="@dimen/dp_10"
|
||||
android:src="@mipmap/ic_clear_text"
|
||||
android:visibility="invisible" />
|
||||
|
||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||
</FrameLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/layout_options"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/dp_12"
|
||||
android:layout_marginTop="@dimen/dp_14"
|
||||
android:layout_marginEnd="@dimen/dp_12"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintTop_toBottomOf="@id/mTitleBar">
|
||||
|
||||
<com.cheng.bole.widget.CommonShapeView
|
||||
android:id="@+id/btn_area"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/dp_34"
|
||||
android:layout_weight="1"
|
||||
android:drawableEnd="@mipmap/ic_option_arrow_down"
|
||||
android:drawablePadding="@dimen/dp_4"
|
||||
android:text="地区"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_13"
|
||||
app:csb_cornerRadius="@dimen/dp_25"
|
||||
app:csb_drawablePosition="right" />
|
||||
|
||||
<com.cheng.bole.widget.CommonShapeView
|
||||
android:id="@+id/btn_time"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/dp_34"
|
||||
android:layout_marginStart="@dimen/dp_9"
|
||||
android:layout_weight="1"
|
||||
android:drawableEnd="@mipmap/ic_option_arrow_down"
|
||||
android:drawablePadding="@dimen/dp_4"
|
||||
android:text="时间"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_13"
|
||||
app:csb_cornerRadius="@dimen/dp_25"
|
||||
app:csb_drawablePosition="right" />
|
||||
|
||||
<com.cheng.bole.widget.CommonShapeView
|
||||
android:id="@+id/btn_sort"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/dp_34"
|
||||
android:layout_marginStart="@dimen/dp_9"
|
||||
android:layout_weight="1"
|
||||
android:drawableEnd="@mipmap/ic_option_arrow_down"
|
||||
android:drawablePadding="@dimen/dp_4"
|
||||
android:text="排序"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_13"
|
||||
app:csb_cornerRadius="@dimen/dp_25"
|
||||
app:csb_drawablePosition="right" />
|
||||
|
||||
<com.cheng.bole.widget.CommonShapeView
|
||||
android:id="@+id/btn_type"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/dp_34"
|
||||
android:layout_marginStart="@dimen/dp_9"
|
||||
android:layout_weight="1"
|
||||
android:drawableEnd="@mipmap/ic_option_arrow_down"
|
||||
android:drawablePadding="@dimen/dp_4"
|
||||
android:text="信息"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_13"
|
||||
app:csb_cornerRadius="@dimen/dp_25"
|
||||
app:csb_drawablePosition="right" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<com.scwang.smart.refresh.layout.SmartRefreshLayout
|
||||
android:id="@+id/mRefreshLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:background="@color/windowBackground"
|
||||
android:layout_marginTop="@dimen/dp_5"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/layout_options">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/mRecyclerView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
tools:listitem="@layout/listitem_bid" />
|
||||
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
|
||||
|
||||
<View
|
||||
android:id="@+id/view_mask"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:background="#cc000000"
|
||||
android:clickable="true"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toBottomOf="@id/mRefreshLayout"
|
||||
app:layout_constraintTop_toTopOf="@id/mRefreshLayout" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_marginTop="@dimen/dp_16">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/dp_22"
|
||||
android:layout_marginEnd="@dimen/dp_22"
|
||||
android:ellipsize="end"
|
||||
android:gravity="center"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:text="20250711180945-2000026473"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_14"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<com.cheng.bole.widget.CommonShapeView
|
||||
android:id="@+id/btn_download"
|
||||
android:layout_width="@dimen/dp_132"
|
||||
android:layout_height="@dimen/dp_34"
|
||||
android:layout_marginTop="@dimen/dp_16"
|
||||
android:text="下载并分享到微信"
|
||||
android:textColor="@color/color_125ffe"
|
||||
android:textSize="@dimen/sp_13"
|
||||
app:csb_activeEnable="true"
|
||||
app:csb_fillColor="#0d125ffe"
|
||||
app:csb_cornerRadius="@dimen/dp_10"
|
||||
app:csb_strokeColor="@color/color_125ffe"
|
||||
app:csb_strokeWidth="@dimen/dp_1"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_name" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_marginTop="@dimen/dp_8"
|
||||
android:layout_height="wrap_content"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="郭女士"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_14"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_phone"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="0937-6719119"
|
||||
android:layout_marginStart="@dimen/dp_16"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_14"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/tv_name"/>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/iv_call"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:src="@mipmap/ic_phone_contacts"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.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">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/iv_image"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="@dimen/dp_30"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:background="@drawable/shape_f6f6f6_cor25"
|
||||
android:paddingStart="@dimen/dp_14"
|
||||
android:layout_marginStart="@dimen/dp_5"
|
||||
android:layout_marginEnd="@dimen/dp_5"
|
||||
android:layout_marginTop="@dimen/dp_10"
|
||||
android:paddingEnd="@dimen/dp_14">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="国土局"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:textColor="@color/color_666666"
|
||||
android:textSize="@dimen/sp_13" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout 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="@dimen/dp_40">
|
||||
|
||||
<com.cheng.bole.widget.CommonShapeView
|
||||
android:id="@+id/tv_tag"
|
||||
android:layout_width="@dimen/dp_16"
|
||||
android:layout_height="@dimen/dp_16"
|
||||
android:text="1"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="@dimen/sp_12"
|
||||
app:csb_cornerRadius="@dimen/dp_2"
|
||||
app:csb_endColor="#FFCD1B"
|
||||
app:csb_orientation="TOP_BOTTOM"
|
||||
app:csb_startColor="#FFB505"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/dp_8"
|
||||
android:text="招标公告"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_14"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/tv_tag"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_count"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="2.5万次"
|
||||
android:textColor="#0A204D"
|
||||
android:textSize="@dimen/sp_12"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout 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="@dimen/dp_40"
|
||||
android:paddingStart="@dimen/dp_30"
|
||||
android:paddingEnd="@dimen/dp_25">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="全部"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_14"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/iv_check"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/ic_option_checked"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout 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="@dimen/dp_40">
|
||||
|
||||
<View
|
||||
android:id="@+id/view_tag"
|
||||
android:layout_width="@dimen/dp_4"
|
||||
android:background="@drawable/shape_search_option_tag"
|
||||
android:layout_height="@dimen/dp_16"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="全国地区"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_14"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="@dimen/dp_30"
|
||||
android:layout_marginStart="@dimen/dp_5"
|
||||
android:layout_marginTop="@dimen/dp_10"
|
||||
android:layout_marginEnd="@dimen/dp_5"
|
||||
android:background="@drawable/shape_f6f6f6_cor25"
|
||||
android:paddingStart="@dimen/dp_14"
|
||||
android:paddingEnd="@dimen/dp_14">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="国土局"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_13"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
@ -0,0 +1,172 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/shape_white_bottom_cor10">
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:id="@+id/nestedScrollView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintHeight_max="@dimen/dp_400"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/layout_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintHeight_max="@dimen/dp_400">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rv_parent"
|
||||
android:layout_width="@dimen/dp_120"
|
||||
android:layout_height="0dp"
|
||||
android:background="@color/color_f6f6f6"
|
||||
android:orientation="vertical"
|
||||
android:overScrollMode="never"
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:listitem="@layout/listitem_search_option_parent" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rv_child"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@color/white"
|
||||
android:orientation="vertical"
|
||||
android:overScrollMode="never"
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/rv_parent"
|
||||
tools:listitem="@layout/listitem_search_option_child" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/layout_custom_time"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="@dimen/dp_16"
|
||||
android:paddingEnd="@dimen/dp_16"
|
||||
android:paddingBottom="@dimen/dp_12"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintTop_toBottomOf="@id/layout_content"
|
||||
tools:visibility="visible">
|
||||
|
||||
<View
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
android:layout_width="match_parent"
|
||||
android:background="@color/color_eeeeee"
|
||||
android:layout_height="@dimen/dp_1"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_custom_time_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="自定义时间"
|
||||
android:layout_marginTop="@dimen/dp_12"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textSize="@dimen/sp_15"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_start_time"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/dp_34"
|
||||
android:layout_marginTop="@dimen/dp_20"
|
||||
android:background="@drawable/shape_f6f6f6_cor4"
|
||||
android:gravity="center"
|
||||
android:hint="开始时间"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textColorHint="@color/color_999999"
|
||||
android:textSize="@dimen/sp_14"
|
||||
app:layout_constraintEnd_toStartOf="@id/view_divider"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_custom_time_title" />
|
||||
|
||||
<View
|
||||
android:id="@+id/view_divider"
|
||||
android:layout_width="@dimen/dp_26"
|
||||
android:layout_height="@dimen/dp_1"
|
||||
android:layout_marginStart="@dimen/dp_12"
|
||||
android:layout_marginEnd="@dimen/dp_12"
|
||||
android:background="@color/color_dddddd"
|
||||
app:layout_constraintBottom_toBottomOf="@id/tv_start_time"
|
||||
app:layout_constraintEnd_toStartOf="@id/tv_end_time"
|
||||
app:layout_constraintStart_toEndOf="@id/tv_start_time"
|
||||
app:layout_constraintTop_toTopOf="@id/tv_start_time" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_end_time"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/dp_34"
|
||||
android:layout_marginTop="@dimen/dp_20"
|
||||
android:background="@drawable/shape_f6f6f6_cor4"
|
||||
android:gravity="center"
|
||||
android:hint="结束时间"
|
||||
android:textColor="@color/color_1a1a1a"
|
||||
android:textColorHint="@color/color_999999"
|
||||
android:textSize="@dimen/sp_14"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/view_divider"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_custom_time_title" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0.5dp"
|
||||
android:background="@color/color_e8e8e8"
|
||||
app:layout_constraintBottom_toTopOf="@id/layout_bottom" />
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/layout_bottom"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="@dimen/dp_12"
|
||||
android:paddingTop="@dimen/dp_14"
|
||||
android:paddingEnd="@dimen/dp_12"
|
||||
android:paddingBottom="@dimen/dp_14"
|
||||
app:layout_constraintTop_toBottomOf="@id/nestedScrollView">
|
||||
|
||||
<com.cheng.bole.widget.CommonShapeView
|
||||
android:id="@+id/btn_reset"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/dp_40"
|
||||
android:text="重置"
|
||||
android:textColor="@color/color_9a9ea7"
|
||||
android:textSize="@dimen/sp_15"
|
||||
app:csb_activeEnable="true"
|
||||
app:csb_cornerRadius="@dimen/dp_10"
|
||||
app:csb_fillColor="@color/color_ebf5ff"
|
||||
app:layout_constraintEnd_toStartOf="@id/btn_next"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<com.cheng.bole.widget.CommonShapeView
|
||||
android:id="@+id/btn_next"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/dp_40"
|
||||
android:layout_marginStart="@dimen/dp_10"
|
||||
android:text="确定"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="@dimen/sp_15"
|
||||
app:csb_cornerRadius="@dimen/dp_10"
|
||||
app:csb_fillColor="@color/color_125ffe"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/btn_reset"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
After Width: | Height: | Size: 232 KiB |
|
After Width: | Height: | Size: 382 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 720 B |
|
After Width: | Height: | Size: 576 B |
|
After Width: | Height: | Size: 598 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
|
@ -1,6 +1,6 @@
|
|||
<resources>
|
||||
<!-- Base application theme. -->
|
||||
<style name="Theme.Material" parent="Theme.MaterialComponents.Light.NoActionBar">
|
||||
<style name="Theme.Base" parent="Theme.MaterialComponents.Light.NoActionBar">
|
||||
<item name="colorPrimary">@color/colorPrimary</item>
|
||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||
<item name="colorAccent">@color/color_2090fe</item>
|
||||
|
|
@ -26,7 +26,7 @@
|
|||
<item name="android:windowExitAnimation">@anim/dialog_exit</item>
|
||||
</style>
|
||||
|
||||
<style name="SplashTheme" parent="Theme.Material">
|
||||
<style name="SplashTheme" parent="Theme.Base">
|
||||
<item name="android:windowNoTitle">true</item>
|
||||
<item name="android:windowFullscreen">true</item>
|
||||
<!-- 单色填充背景 -->
|
||||
|
|
|
|||
|
|
@ -76,4 +76,5 @@
|
|||
<color name="color_ff2222">#FF2222</color>
|
||||
<color name="color_ff493c">#FF493C</color>
|
||||
<color name="color_ffb92d">#FFB92D</color>
|
||||
<color name="color_dddddd">#DDDDDD</color>
|
||||
</resources>
|
||||
|
|
@ -85,5 +85,6 @@
|
|||
<dimen name="dp_130">130dp</dimen>
|
||||
<dimen name="dp_42">42dp</dimen>
|
||||
<dimen name="dp_170">170dp</dimen>
|
||||
<dimen name="dp_132">132dp</dimen>
|
||||
|
||||
</resources>
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
<resources>
|
||||
<!-- Base application theme. -->
|
||||
<style name="Theme.Material" parent="Theme.MaterialComponents.Light.NoActionBar">
|
||||
<style name="Theme.Base" parent="Theme.MaterialComponents.Light.NoActionBar">
|
||||
<item name="colorPrimary">@color/colorPrimary</item>
|
||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||
<item name="colorAccent">@color/color_2090fe</item>
|
||||
|
|
@ -26,7 +26,7 @@
|
|||
<item name="android:windowExitAnimation">@anim/dialog_exit</item>
|
||||
</style>
|
||||
|
||||
<style name="SplashTheme" parent="Theme.Material">
|
||||
<style name="SplashTheme" parent="Theme.Base">
|
||||
<item name="android:windowNoTitle">true</item>
|
||||
<item name="android:windowFullscreen">true</item>
|
||||
<item name="android:windowBackground">@drawable/layer_splash</item>
|
||||
|
|
|
|||