Commit f656e302 by Dell

1、推单

2、表情包
3、搜索问题
4、优化直播间文字问题
parent 1d3660dd
......@@ -144,8 +144,7 @@ dependencies {
kapt 'com.arialyy.aria:compiler:3.8.10'
implementation 'com.arialyy.aria:m3u8Component:3.8.10'
//glide
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
implementation 'com.google.android:flexbox:1.0.0'
implementation ("com.github.bumptech.glide:recyclerview-integration:4.8.0") {
......@@ -177,6 +176,7 @@ dependencies {
implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0'
implementation 'com.github.zhpanvip:bannerviewpager:3.5.4'
implementation 'com.github.li-xiaojun:XPopup:2.7.5'
// implementation 'com.github.xiaweizi:MarqueeTextView:1.0'
......
......@@ -180,6 +180,7 @@
<activity android:name=".ui.activity.AccountSettingActivity" />
<activity android:name=".ui.activity.EditPasswordActivity" />
<activity android:name=".ui.activity.SettingPasswordActivity" />
<activity android:name=".ui.activity.SearchActivity" />
</application>
......
......@@ -48,6 +48,10 @@ interface HostUrl {
const val POST_LIST_ICON = "capi/index/listIcon"
/**
* 调用搜索接口
*/
const val POST_MAIN_SEARCH = "live/roomByNameSearch"
/**
* 登录接口
......@@ -594,6 +598,16 @@ interface HostUrl {
const val POST_GET_CHAT_HISTORY_MESSAGE = "room/getChatHistoryMessage"
/**
* 获取推单
*/
const val POST_PUSH_ORDER_LIST = "V1/room/getPushOrderList"
/**
* 用户操作推单
*/
const val POST_EDIT_FOLLOW_PUSH_ORDER= "V1/room/editFollowPushOrder"
/**
* 获取礼物排行榜
*/
const val POST_ROOM_RANK = "room/leaderboard"
......
package com.hupu.tv.player.app.api
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.ObservableSource
import io.reactivex.rxjava3.functions.Function
import java.util.concurrent.TimeUnit
class RepeatFunction : Function<Observable<Any?>, ObservableSource<*>> {
// 将原始 Observable 停止发送事件的标识(Complete() / Error())转换成1个 Object 类型数据传递给1个新被观察者(Observable)
// 以此决定是否重新订阅 & 发送原来的 Observable,即轮询 // 此处有2种情况:
// 1. 若返回1个Complete() / Error()事件,则不重新订阅 & 发送原来的 Observable,即轮询结束
// 2. 若返回其余事件,则重新订阅 & 发送原来的 Observable,即继续轮询
@Throws(Exception::class)
override fun apply(objectObservable: Observable<Any?>): ObservableSource<*> {
// 延时5s轮询
// 轮询器业务需求
// 任何页面只能取当前page和之前的page,setLoadMore不可用,因为是更新数据,并非加载新的数据
// 只轮询当前页面page,数据是更改,不能是新加,暂时去掉,明天重点看
return objectObservable.flatMap<Any> {
Observable.timer(20, TimeUnit.SECONDS)
}
}
}
\ No newline at end of file
......@@ -67,6 +67,12 @@ interface RetrofitService {/*@Field("is_new") int is_new*/
fun getAvatarUrl(): Observable<BaseBean<String>>
/**
* 搜索
*/
@POST(HostUrl.Companion.POST_MAIN_SEARCH)
fun mainSearch(@Body requestBody: RequestBody): Observable<BaseBean<LiveBean>>
/**
* 获取首页banner
*/
@POST(HostUrl.POST_LIVE_BANNER)
......@@ -627,6 +633,19 @@ interface RetrofitService {/*@Field("is_new") int is_new*/
@POST(HostUrl.Companion.POST_GET_CHAT_HISTORY_MESSAGE)
fun getHistoryMessage(@Body requestBody: RequestBody): Observable<BaseBean<List<HistoryMessageEntity>>>
/**
* 获取推单
*/
@POST(HostUrl.Companion.POST_PUSH_ORDER_LIST)
fun getRoomPushList(@Body requestBody: RequestBody): Observable<BaseBean<List<FollowListEntity>>>
/**
* 用户操作推单
*/
@POST(HostUrl.Companion.POST_EDIT_FOLLOW_PUSH_ORDER)
fun userEditOrder(@Body requestBody: RequestBody): Observable<BaseBean<Any>>
/**
* 获取赛事列表
*/
......
......@@ -38,6 +38,9 @@ object Constants {
//token
const val TOKEN = "token"
//搜索本地关键字
const val SEARCH_KEYWORD_MAIN = "search_keyword_main"
//分享码
const val SHARE_CODE = "share_code"
......
package com.hupu.tv.player.app.bean
/**
* @author by Dell
* @date on 2022/4/12
* @describe
*/
data class FollowListEntity(
val follow: Int,
val id: Int,
val orderOption: String,
val orderResult: Int,
val orderTitle: String,
val unFollow: Int
)
\ No newline at end of file
......@@ -25,10 +25,7 @@ import com.softgarden.baselibrary.utils.ToastUtil
import com.hupu.tv.player.app.R
import com.hupu.tv.player.app.app.Constants
import com.hupu.tv.player.app.base.RefreshActivity
import com.hupu.tv.player.app.bean.GiftBean
import com.hupu.tv.player.app.bean.HistoryMessageEntity
import com.hupu.tv.player.app.bean.LiveBean
import com.hupu.tv.player.app.bean.RoomInfoBean
import com.hupu.tv.player.app.bean.*
import com.hupu.tv.player.app.event.*
import com.hupu.tv.player.app.ui.adapter.LiveRecommendAdapter
import com.hupu.tv.player.app.ui.contact.LiveActivityContact
......@@ -38,6 +35,8 @@ import com.hupu.tv.player.app.utils.CommonUtils
import com.hupu.tv.player.app.utils.DialogUtils
import com.hupu.tv.player.app.utils.GlideUtils
import com.hupu.tv.player.app.widget.danmuku.DanmakuVideoPlayer
import com.hupu.tv.player.app.widget.pop.ShowFollowPop
import com.lxj.xpopup.XPopup
import com.softgarden.baselibrary.utils.RecyclerViewUtil
import kotlinx.android.synthetic.main.activity_live.*
import org.greenrobot.eventbus.EventBus
......@@ -55,7 +54,7 @@ class LiveActivity : RefreshActivity<LiveActivityPresenter>(), LiveActivityConta
private var customDialog: CustomDialog? = null
private var orientationUtils: OrientationUtils? = null
private var mFragment: ArrayList<Fragment> = arrayListOf()
private lateinit var liveAdapter:LiveRecommendAdapter
private lateinit var liveAdapter: LiveRecommendAdapter
private var notice = ""
private var isPlay = false
private var isPause = false
......@@ -67,18 +66,29 @@ class LiveActivity : RefreshActivity<LiveActivityPresenter>(), LiveActivityConta
private var anchorName = ""
private var matchId = ""
private var followNum = ""
private var showFollowPop:ShowFollowPop?=null
private var followList: MutableList<FollowListEntity>? = null
var historyList = arrayListOf<HistoryMessageEntity>()
override fun loadData() {
presenter?.getHistoryMessage(roomId)
presenter?.getFakeMessage()
presenter?.getRoomInfo(roomId)
presenter?.getRecommend(roomId,mPage)
presenter?.getRecommend(roomId, mPage)
}
fun setHistoryList(){
fun showFollow() {
if (showFollowPop == null){
showFollowPop = ShowFollowPop(this, followList) { isFollow, id ->
presenter?.userEditOrder(id, if (isFollow) 1 else 2)
}
}
XPopup.Builder(this)
.asCustom(showFollowPop).show()
}
override fun setToolbar(builder: BaseToolbar.Builder): BaseToolbar.Builder? {
return null
}
......@@ -87,6 +97,19 @@ class LiveActivity : RefreshActivity<LiveActivityPresenter>(), LiveActivityConta
historyList = data as ArrayList<HistoryMessageEntity>
}
override fun onFollowList(data: List<FollowListEntity>?) {
followList = data as MutableList<FollowListEntity>?
if (followList?.isNotEmpty() == true){
iv_anchor_list.visibility = View.VISIBLE
GlideUtils.loadImageGif(this,R.mipmap.icon_anchor_list,iv_anchor_list)
}
showFollowPop?.refreshData(followList)
}
override fun onUserEditOrder() {
presenter?.getFollowList(roomId)
}
override val layoutId: Int
get() = R.layout.activity_live
......@@ -103,7 +126,7 @@ class LiveActivity : RefreshActivity<LiveActivityPresenter>(), LiveActivityConta
private fun initAdapter() {
liveAdapter = LiveRecommendAdapter()
recycler_recommend.adapter = liveAdapter
if (recycler_recommend.itemDecorationCount == 0){
if (recycler_recommend.itemDecorationCount == 0) {
RecyclerViewUtil.addGridItemDecoration(
this,
recycler_recommend,
......@@ -114,8 +137,8 @@ class LiveActivity : RefreshActivity<LiveActivityPresenter>(), LiveActivityConta
liveAdapter.setOnItemClickListener { adapter, view, position ->
val item: LiveBean.DataListBean = adapter.getItem(position) as LiveBean.DataListBean
val intent = Intent(activity, LiveActivity::class.java)
intent.putExtra(Constants.ROOM_ID,item.roomId)
intent.putExtra(Constants.ROOM_COVER,item.matchCutImg)
intent.putExtra(Constants.ROOM_ID, item.roomId)
intent.putExtra(Constants.ROOM_COVER, item.matchCutImg)
startActivity(intent)
}
}
......@@ -130,6 +153,11 @@ class LiveActivity : RefreshActivity<LiveActivityPresenter>(), LiveActivityConta
}
private fun initView() {
iv_anchor_list.setOnClickListener {
showFollow()
}
ll_follow.setOnClickListener {
if (SPUtil[Constants.USER_LOGIN, false] == true) {
if (isFollow) {
......@@ -141,6 +169,8 @@ class LiveActivity : RefreshActivity<LiveActivityPresenter>(), LiveActivityConta
DialogUtils.showLogin(activity as AppCompatActivity)
}
}
}
private fun initPlayer(fire: String, num: String?, title: String, url: String) {
......@@ -284,7 +314,7 @@ class LiveActivity : RefreshActivity<LiveActivityPresenter>(), LiveActivityConta
private fun initTabLayout() {
mFragment.add(LiveConversationFragment.newInstance(roomId, notice, LiveRoomUserName, liveUserHxId,anchorName))
mFragment.add(LiveConversationFragment.newInstance(roomId, notice, LiveRoomUserName, liveUserHxId, anchorName))
mFragment.add(LiveAnchorFragment.newInstance(roomId))
// mFragment.add(LiveRankFragment.newInstance(roomId))
mFragment.add(LiveRedListFragment.newInstance(matchId))
......@@ -323,6 +353,7 @@ class LiveActivity : RefreshActivity<LiveActivityPresenter>(), LiveActivityConta
tv_follow_num.text = "粉丝:${bean.follows}"
GlideUtils.loadAvatar(this, bean.anchorAvatar, iv_avatar)
}
presenter?.getFollowList(roomId)
matchId = bean?.matchId ?: ""
addMessage("请求房间信息成功 直播间 IM userId = ${bean?.huanXinUserId}")
......
package com.hupu.tv.player.app.ui.activity
import android.content.Context
import android.content.Intent
import android.os.IBinder
import android.text.Editable
import android.text.TextWatcher
import android.view.MotionEvent
import android.view.View
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import com.mirkowu.basetoolbar.BaseToolbar
import com.softgarden.baselibrary.utils.ToastUtil
import com.hupu.tv.player.app.R
import com.hupu.tv.player.app.app.Constants
import com.hupu.tv.player.app.base.RefreshActivity
import com.hupu.tv.player.app.bean.LiveBean
import com.hupu.tv.player.app.bean.SearchTagBean
import com.hupu.tv.player.app.ui.adapter.LiveItemAdapter
import com.hupu.tv.player.app.ui.adapter.SearchLabelAdapter
import com.hupu.tv.player.app.ui.contact.SearchActivityContact
import com.hupu.tv.player.app.ui.presenter.SearchActivityPresenter
import com.hupu.tv.player.app.utils.KeyboardChangeUtil
import com.softgarden.baselibrary.utils.RecyclerViewUtil
import kotlinx.android.synthetic.main.activity_search.*
class SearchActivity : RefreshActivity<SearchActivityPresenter>(), SearchActivityContact.Display {
private var searchKey = ""
private var localAdapter = SearchLabelAdapter()
private var liveItemAdapter = LiveItemAdapter()
override val layoutId: Int
get() = R.layout.activity_search
override val baseActivity: SearchActivity
get() = this
override fun onSearchData(list: List<LiveBean.DataListBean>?) {
setLoadMore(liveItemAdapter, list)
}
override fun updateLocalData(list: ArrayList<String>) {
if (list.isNotEmpty()) {
ll_history.visibility = View.VISIBLE
} else {
ll_history.visibility = View.GONE
}
localAdapter.setNewData(list)
}
override fun onShowLocalData(list: ArrayList<String>?) {
if (list?.isNotEmpty() == true) {
ll_history.visibility = View.VISIBLE
localAdapter.setNewData(list)
}
}
override fun onHotList(list: ArrayList<SearchTagBean>?) {
}
override val ctx: Context
get() = this
override fun initialize() {
operateKeyBoard()
initRefreshLayout()
initRecyclerView()
initAdapter()
initListener()
presenter?.showLocalData()
}
private fun initListener() {
tv_cancel.setOnClickListener {
onBackPressed()
}
iv_delete.setOnClickListener {
presenter?.clearLocalData()
}
}
private fun initAdapter() {
recycler_local.apply {
adapter = localAdapter.apply {
setOnItemClickListener { adapter, view, position ->
mPage = PageStart
searchKey = adapter.getItem(position) as String
et_search.setText(searchKey)
presenter?.searchData(searchKey, true, mPage)
}
}
}
mRecyclerView?.adapter = liveItemAdapter
if (mRecyclerView?.itemDecorationCount == 0) {
RecyclerViewUtil.addGridItemDecoration(this, mRecyclerView!!, R.color.transparent, Constants.item_divider_4 * 2)
}
liveItemAdapter.setOnItemClickListener { adapter, view, position ->
val item: LiveBean.DataListBean = adapter.getItem(position) as LiveBean.DataListBean
val intent = Intent(activity, LiveActivity::class.java)
intent.putExtra(Constants.ROOM_ID, item.roomId)
intent.putExtra(Constants.ROOM_COVER, item.matchCutImg)
startActivity(intent)
}
}
override fun setToolbar(builder: BaseToolbar.Builder): BaseToolbar.Builder? {
return null
}
override fun loadData() {
if (searchKey.isNotEmpty()){
presenter?.searchData(searchKey,true,mPage)
}
// presenter?.getHotTag()
}
/* ---------------------------以下代码,皆为键盘的操作------------------------------*/
/**
* 软键盘和editText
*/
private fun operateKeyBoard() {
//键盘弹出和收起的监听
KeyboardChangeUtil(this).setOnKeyboardChangeListener(object :
KeyboardChangeUtil.KeyboardChangeListener {
override fun onKeyboardShow(keyboardHight: Int) {
ll_label.visibility = View.VISIBLE
}
override fun onKeyboardHide() {
}
})
//键盘右下角改为搜索
et_search.setOnEditorActionListener { v, actionId, event ->
var handler = false
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
mPage = 1
searchKey = et_search.text.toString()
if (searchKey.isEmpty()) {
ToastUtil.s("请输入关键字")
} else {
presenter?.searchData(searchKey, true, mPage)
}
handler = true
/*隐藏软键盘*/
hideKeyboard(this.currentFocus?.windowToken)
val inputMethodManager =
getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
if (inputMethodManager.isActive) {
inputMethodManager.hideSoftInputFromWindow(this.currentFocus?.windowToken, 0)
}
}
handler
}
et_search.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
override fun afterTextChanged(s: Editable?) {
}
})
}
//事件分发方法重写,并且点击非editText 收起软键盘
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
//如果是点击事件,获取点击的view,并判断是否要收起键盘
if (ev.action == MotionEvent.ACTION_DOWN) {
//获取目前得到焦点的view
val v = currentFocus
//判断是否要收起并进行处理
if (isShouldHideKeyboard(v, ev)) {
hideKeyboard(v?.windowToken)
}
}
//这个是activity的事件分发,一定要有,不然就不会有任何的点击事件了
return super.dispatchTouchEvent(ev)
}
//判断是否要收起键盘
private fun isShouldHideKeyboard(v: View?, event: MotionEvent): Boolean {
//如果目前得到焦点的这个view是editText的话进行判断点击的位置
if (v is EditText) {
val l = intArrayOf(0, 0)
v.getLocationInWindow(l)
val left = l[0]
val top = l[1]
val bottom = top + v.getHeight()
val right = left + v.getWidth()
// 点击EditText的事件,忽略它。
return (event.x <= left || event.x >= right
|| event.y <= top || event.y >= bottom)
}
// 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上
return false
}
//隐藏软键盘并让editText失去焦点
private fun hideKeyboard(token: IBinder?) {
et_search.clearFocus()
token?.let {
//这里先获取InputMethodManager再调用他的方法来关闭软键盘
//InputMethodManager就是一个管理窗口输入的manager
val im = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
if (im.isActive) {
im.hideSoftInputFromWindow(it, InputMethodManager.HIDE_NOT_ALWAYS)
}
}
}
}
\ No newline at end of file
......@@ -14,11 +14,11 @@ import com.softgarden.baselibrary.base.BaseFragment
* @date on 2020/6/15
* @describe
*/
class LiveItemAdapter(layoutResId: Int, private val fragment: BaseFragment<*>) :
BaseQuickAdapter<LiveBean.DataListBean, BaseViewHolder>(layoutResId) {
class LiveItemAdapter :
BaseQuickAdapter<LiveBean.DataListBean, BaseViewHolder>(R.layout.item_match_normal_live) {
override fun convert(helper: BaseViewHolder, item: LiveBean.DataListBean) {
GlideUtils.loadImageNoCenter(
fragment,
helper.itemView.context,
item.matchCutImg,
helper.getView(R.id.iv_cover),
R.mipmap.bg_live_place_holder
......
......@@ -2,6 +2,7 @@ package com.hupu.tv.player.app.ui.adapter
import android.widget.ImageView
import android.widget.TextView
import com.blankj.utilcode.util.SpanUtils
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.hupu.tv.player.app.R
......@@ -14,10 +15,15 @@ import com.hupu.tv.player.app.bean.HistoryMessageEntity
*/
class MessageHistoryAdapter : BaseQuickAdapter<HistoryMessageEntity, BaseViewHolder>(R.layout.custom_row_received_message) {
override fun convert(helper: BaseViewHolder, item: HistoryMessageEntity) {
helper
.setVisible(R.id.tv_userid,true)
.setText(R.id.tv_userid, "${item.sendUser}:")
.setText(R.id.tv_chatcontent, item.msgContent)
.getView<ImageView>(R.id.iv_level).setImageResource(R.mipmap.icon_user_level_25)
helper.setText(
R.id.tv_chatcontent, SpanUtils
.with(helper.getView(R.id.tv_chatcontent))
.appendImage(R.mipmap.icon_user_level_25, SpanUtils.ALIGN_CENTER)
.append(item.sendUser + ":")
.setForegroundColor(mContext.getColor(R.color.user_nick))
.append(item.msgContent)
.create()
)
}
}
\ No newline at end of file
package com.hupu.tv.player.app.ui.adapter
import android.os.Build
import android.widget.TextView
import androidx.annotation.RequiresApi
import com.softgarden.baselibrary.BaseApplication.Companion.instance
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.hupu.tv.player.app.R
import com.softgarden.baselibrary.BaseApplication
import java.util.*
/**
* @author by Dell
* @date on 2020/6/15
* @describe
*/
class SearchLabelAdapter :
BaseQuickAdapter<String, BaseViewHolder>(R.layout.item_search_label) {
override fun convert(helper: BaseViewHolder, item: String) {
helper.setText(R.id.tv_label,item)
}
}
\ No newline at end of file
package com.hupu.tv.player.app.ui.adapter
import android.widget.ImageView
import com.hupu.tv.player.app.bean.MovieDetailBean.ActorVOsListBean
import com.softgarden.baselibrary.base.BaseActivity
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.hupu.tv.player.app.R
import com.hupu.tv.player.app.bean.FollowListEntity
import com.hupu.tv.player.app.utils.GlideUtils
/**
* @author by Dell
* @date on 2020/6/15
* @describe
*/
class ShowFollowDownAdapter :
BaseQuickAdapter<FollowListEntity, BaseViewHolder>(R.layout.item_follow) {
override fun convert(helper: BaseViewHolder, item: FollowListEntity) {
helper
.setGone(R.id.tv_type, item.orderOption.isNotEmpty())
.setText(R.id.tv_type, item.orderOption)
.setText(R.id.tv_name, item.orderTitle)
.setText(R.id.tv_result, "${item.follow}人跟单,${item.unFollow}人反买")
.getView<ImageView>(R.id.iv_type).setImageResource(
when (item.orderResult) {
1 -> R.mipmap.icon_follow_red
2 -> R.mipmap.icon_follow_black
3 -> R.mipmap.icon_follow_green
else -> 0
}
)
}
}
\ No newline at end of file
package com.hupu.tv.player.app.ui.adapter
import android.view.View
import android.widget.LinearLayout
import com.hupu.tv.player.app.bean.MovieDetailBean.ActorVOsListBean
import com.softgarden.baselibrary.base.BaseActivity
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.hupu.tv.player.app.R
import com.hupu.tv.player.app.bean.FollowListEntity
import com.hupu.tv.player.app.utils.GlideUtils
/**
* @author by Dell
* @date on 2020/6/15
* @describe
*/
class ShowFollowTopAdapter :
BaseQuickAdapter<FollowListEntity, BaseViewHolder>(R.layout.item_follow_top) {
override fun convert(helper: BaseViewHolder, item: FollowListEntity) {
helper
.setGone(R.id.tv_type,item.orderOption.isNotEmpty())
.setText(R.id.tv_type,item.orderOption)
.setText(R.id.tv_name,item.orderTitle)
.setText(R.id.tv_follow,"${item.follow}人跟单")
.setText(R.id.tv_unfollow,"${item.unFollow}人反买")
.addOnClickListener(R.id.tv_follow)
.addOnClickListener(R.id.tv_unfollow)
.apply {
getView<View>(R.id.view_start).apply {
val layoutParams = layoutParams as LinearLayout.LayoutParams
layoutParams.weight = 1+(item.follow.toFloat().div(10))
this.layoutParams = layoutParams
}
getView<View>(R.id.view_end).apply {
val layoutParams = layoutParams as LinearLayout.LayoutParams
layoutParams.weight = 1+(item.unFollow.toFloat().div(10))
this.layoutParams = layoutParams
}
}
}
}
\ No newline at end of file
package com.hupu.tv.player.app.ui.contact
import com.hupu.tv.player.app.bean.FollowListEntity
import com.hupu.tv.player.app.bean.HistoryMessageEntity
import com.hupu.tv.player.app.bean.LiveBean
import com.softgarden.baselibrary.base.IBaseDisplay
......@@ -17,6 +18,8 @@ interface LiveActivityContact {
fun onSendGift(id:Int,position:Int)
fun onRecommend(data: LiveBean?)
fun onHistoryMessage(data:List<HistoryMessageEntity>?)
fun onFollowList(data:List<FollowListEntity>?)
fun onUserEditOrder()
}
......@@ -28,5 +31,7 @@ interface LiveActivityContact {
fun getRecommend(id:String,pageNum:Int)
fun sendGift (giftId:Int,roomId:String,giftPosition:Int)
fun getHistoryMessage(id:String)
fun getFollowList(id: String)
fun userEditOrder(orderId:Int,orderResult:Int)
}
}
\ No newline at end of file
package com.hupu.tv.player.app.ui.contact
import com.hupu.tv.player.app.bean.LiveBean
import com.softgarden.baselibrary.base.IBaseDisplay
import com.hupu.tv.player.app.bean.MovieBean
import com.hupu.tv.player.app.bean.SearchTagBean
......@@ -11,11 +12,10 @@ import com.hupu.tv.player.app.bean.SearchTagBean
*/
interface SearchActivityContact {
interface Display : IBaseDisplay {
fun onSearchData(list: ArrayList<MovieBean.RecordsBean>?)
fun onSearchData(list: List<LiveBean.DataListBean>?)
fun updateLocalData(list: ArrayList<String>)
fun onShowLocalData(list: ArrayList<String>?)
fun onHotList(list:ArrayList<SearchTagBean>?)
fun onLikeMovie(list:ArrayList<MovieBean.RecordsBean>?)
}
interface Presenter {
......@@ -23,6 +23,6 @@ interface SearchActivityContact {
fun clearLocalData()
fun showLocalData()
fun getHotTag()
fun getLikeMovie()
}
}
\ No newline at end of file
......@@ -85,7 +85,7 @@ class FollowAnchorFragment : ToolbarFragment<FollowAnchorPresenter>(), FollowAnc
}
private fun initDownRecyclerView() {
liveItemAdapter = LiveItemAdapter(R.layout.item_match_normal_live, this)
liveItemAdapter = LiveItemAdapter()
mRecyclerView_down?.layoutManager =
RecyclerViewUtil.nestedScrollNoFluent(mRecyclerView_down, GridLayoutManager(activity, 2))
if (mRecyclerView_down.itemDecorationCount == 0) {
......
......@@ -66,7 +66,7 @@ class MainContentAllFragment : RefreshFragment<MainContentAllPresenter>(), MainC
private fun initView() {
initBanner()
liveItemAdapter = LiveItemAdapter(R.layout.item_match_normal_live, this)
liveItemAdapter = LiveItemAdapter()
mRecyclerView?.layoutManager = GridLayoutManager(activity, 2)
if (mRecyclerView?.itemDecorationCount == 0) {
activity?.let {
......
......@@ -54,7 +54,7 @@ class MainContentNormalFragment : RefreshFragment<MainContentNormalPresenter>(),
private fun initView() {
// presenter?.initDot(lineLayout_dot, main_view_pager, tv_pager_title)
liveItemAdapter = LiveItemAdapter(R.layout.item_match_normal_live, this)
liveItemAdapter = LiveItemAdapter()
mRecyclerView?.adapter = liveItemAdapter
mRecyclerView?.layoutManager = GridLayoutManager(activity, 2)
if (mRecyclerView?.itemDecorationCount == 0){
......
......@@ -13,6 +13,7 @@ import com.hupu.tv.player.app.R
import com.hupu.tv.player.app.app.Constants
import com.hupu.tv.player.app.base.RefreshFragment
import com.hupu.tv.player.app.bean.TitleSortBean
import com.hupu.tv.player.app.ui.activity.SearchActivity
import com.hupu.tv.player.app.ui.contact.MainFragmentContact
import com.hupu.tv.player.app.ui.presenter.MainFragmentPresenter
import com.softgarden.baselibrary.utils.ToastUtil
......@@ -43,6 +44,7 @@ class MainFragment : RefreshFragment<MainFragmentPresenter>(), MainFragmentConta
iv_category.setOnClickListener {
ToastUtil.s("敬请期待")
}
ll_search.setOnClickListener { startActivity(SearchActivity::class.java) }
}
private fun initViewPager() {
val list = addDefaultData()
......
package com.hupu.tv.player.app.ui.presenter
import com.hupu.tv.player.app.api.RepeatFunction
import com.softgarden.baselibrary.base.IBaseDisplay
import com.softgarden.baselibrary.base.IBasePresenter
import com.softgarden.baselibrary.network.NetworkTransformer
import com.softgarden.baselibrary.network.RxCallback
import com.hupu.tv.player.app.api.RetrofitClient
import com.hupu.tv.player.app.app.Constants
import com.hupu.tv.player.app.bean.FakeMessageEntity
import com.hupu.tv.player.app.bean.HistoryMessageEntity
import com.hupu.tv.player.app.bean.LiveBean
import com.hupu.tv.player.app.bean.RoomInfoBean
import com.hupu.tv.player.app.bean.*
import com.hupu.tv.player.app.ui.contact.LiveActivityContact
import com.hupu.tv.player.app.utils.JsonUtils
import com.softgarden.baselibrary.utils.SPUtil
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.ObservableSource
import java.util.*
import java.util.concurrent.TimeUnit
import kotlin.collections.HashMap
/**
......@@ -131,5 +134,33 @@ class LiveActivityPresenter : IBasePresenter, LiveActivityContact.Presenter {
})
}
override fun getFollowList(id: String) {
RetrofitClient.retrofitService
.getRoomPushList(JsonUtils.toRequestBody(hashMapOf<String, Any>().apply {
put("id", id)
}))
.repeatWhen { it.flatMap { Observable.timer(30, TimeUnit.SECONDS) } }
.compose(NetworkTransformer(mView))
.subscribe(object : RxCallback<List<FollowListEntity>>() {
override fun onSuccess(data: List<FollowListEntity>?) {
mView?.onFollowList(data)
}
})
}
override fun userEditOrder(orderId: Int, orderResult: Int) {
RetrofitClient.retrofitService
.userEditOrder(JsonUtils.toRequestBody(hashMapOf<String, Any>().apply {
put("orderId", orderId)
put("orderResult", orderResult)
}))
.compose(NetworkTransformer(mView))
.subscribe(object : RxCallback<Any>() {
override fun onSuccess(data: Any?) {
mView?.onUserEditOrder()
}
})
}
}
\ No newline at end of file
......@@ -8,7 +8,7 @@ import com.softgarden.baselibrary.network.RxCallback
import com.softgarden.baselibrary.utils.SPUtil
import com.hupu.tv.player.app.api.RetrofitClient
import com.hupu.tv.player.app.app.Constants
import com.hupu.tv.player.app.bean.MainTagBean
import com.hupu.tv.player.app.bean.LiveBean
import com.hupu.tv.player.app.bean.MovieBean
import com.hupu.tv.player.app.bean.SearchTagBean
import com.hupu.tv.player.app.ui.contact.SearchActivityContact
......@@ -32,18 +32,15 @@ class SearchActivityPresenter : IBasePresenter, SearchActivityContact.Presenter
override fun searchData(key: String?, save: Boolean, pageNo: Int) {
if (!TextUtils.isEmpty(key)) {
val hashMap = HashMap<String, Any>()
hashMap["tagName"] = key!!
hashMap["pageNo"] = pageNo
hashMap["roomName"] = key!!
hashMap["pageNum"] = pageNo
hashMap["pageSize"] = 10
hashMap["userId"] = SPUtil[Constants.USER_ID,0]
RetrofitClient.retrofitService
.searchMovie(JsonUtils.toRequestBody(hashMap))
.mainSearch(JsonUtils.toRequestBody(hashMap))
.compose(NetworkTransformer(mView))
.subscribe(object : RxCallback<MainTagBean>() {
override fun onSuccess(data: MainTagBean?) {
data?.dataList.let {
mView?.onSearchData(it as ArrayList<MovieBean.RecordsBean>?)
}
.subscribe(object : RxCallback<LiveBean>() {
override fun onSuccess(data: LiveBean?) {
mView?.onSearchData(data?.dataList)
if (save) {
saveLocalSearchData(key)
}
......@@ -55,12 +52,12 @@ class SearchActivityPresenter : IBasePresenter, SearchActivityContact.Presenter
override fun clearLocalData() {
val arrayListOf = arrayListOf<String>()
SPUtil.putSerializableObject(Constants.SEARCH_KEYWORD, arrayListOf)
SPUtil.putSerializableObject(Constants.SEARCH_KEYWORD_MAIN, arrayListOf)
mView?.updateLocalData(arrayListOf)
}
override fun showLocalData() {
val list = SPUtil.getSerializableObject<ArrayList<String>>(Constants.SEARCH_KEYWORD)
val list = SPUtil.getSerializableObject<ArrayList<String>>(Constants.SEARCH_KEYWORD_MAIN)
mView?.onShowLocalData(list)
}
......@@ -75,31 +72,12 @@ class SearchActivityPresenter : IBasePresenter, SearchActivityContact.Presenter
})
}
override fun getLikeMovie() {
val hashMap = HashMap<String, Any>()
hashMap["sortTag"] = 2
hashMap["pageNo"] = 1
hashMap["pageSize"] = 30
hashMap["guessLike"] = true
RetrofitClient.retrofitService
.getSortMovieList(JsonUtils.toRequestBody(hashMap))
.compose(NetworkTransformer(mView))
.subscribe(object : RxCallback<MovieBean>() {
override fun onSuccess(data: MovieBean?) {
data?.records.let {
mView?.onLikeMovie(it as ArrayList<MovieBean.RecordsBean>?)
}
}
})
}
private fun saveLocalSearchData(key: String) {
var list = SPUtil.getSerializableObject<ArrayList<String>>(Constants.SEARCH_KEYWORD)
var list = SPUtil.getSerializableObject<ArrayList<String>>(Constants.SEARCH_KEYWORD_MAIN)
if (list == null || list.isEmpty()) {
val newList = arrayListOf<String>()
newList.add(key)
SPUtil.putSerializableObject(Constants.SEARCH_KEYWORD, newList)
SPUtil.putSerializableObject(Constants.SEARCH_KEYWORD_MAIN, newList)
list = newList
} else {
var containt = false
......@@ -116,7 +94,7 @@ class SearchActivityPresenter : IBasePresenter, SearchActivityContact.Presenter
if (!containt) {
list.add(key)
}
SPUtil.putSerializableObject(Constants.SEARCH_KEYWORD, list)
SPUtil.putSerializableObject(Constants.SEARCH_KEYWORD_MAIN, list)
}
mView?.updateLocalData(list)
}
......
......@@ -13,7 +13,9 @@ import androidx.fragment.app.Fragment;
import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority;
import com.bumptech.glide.load.DecodeFormat;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.gif.GifOptions;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.BitmapImageViewTarget;
import com.hupu.tv.player.app.R;
......@@ -110,6 +112,7 @@ public class GlideUtils {
.diskCacheStrategy(DiskCacheStrategy.ALL);
Glide.with(context).load(url).placeholder(placeHolder).error(placeHolder).apply(options).into(imageView);
}
public static void loadImage(View context, String url, ImageView imageView, int placeHolder) {
RequestOptions options = new RequestOptions()
.centerCrop()
......@@ -132,6 +135,12 @@ public class GlideUtils {
.diskCacheStrategy(DiskCacheStrategy.ALL);
Glide.with(context).load(url).placeholder(placeHolder).error(placeHolder).apply(options).into(imageView);
}
public static void loadImageNoCenter(View context, String url, ImageView imageView, int placeHolder) {
RequestOptions options = new RequestOptions()
// .priority(Priority.HIGH)
.diskCacheStrategy(DiskCacheStrategy.ALL);
Glide.with(context).load(url).placeholder(placeHolder).error(placeHolder).apply(options).into(imageView);
}
public static void loadImageNoCenter(Fragment context, String url, ImageView imageView, int placeHolder) {
RequestOptions options = new RequestOptions()
......@@ -166,6 +175,7 @@ public class GlideUtils {
public static void loadImageGif(Activity activity, int resId, ImageView imageView) {
RequestOptions options = new RequestOptions()
.centerCrop()
.set(GifOptions.DECODE_FORMAT, DecodeFormat.PREFER_ARGB_8888)
.placeholder(0) //占位图
.error(0) //错误图
// .priority(Priority.HIGH)
......
package com.hupu.tv.player.app.widget.pop
import android.content.Context
import androidx.recyclerview.widget.RecyclerView
import com.hupu.tv.player.app.R
import com.hupu.tv.player.app.bean.FollowListEntity
import com.hupu.tv.player.app.ui.adapter.ShowFollowDownAdapter
import com.hupu.tv.player.app.ui.adapter.ShowFollowTopAdapter
import com.lxj.xpopup.core.BottomPopupView
import com.softgarden.baselibrary.utils.RecyclerViewUtil
/**
* @author by Dell
* @date on 2022/4/12
* @describe
*/
class ShowFollowPop(
context: Context,
val followList: MutableList<FollowListEntity>?,
val click: (isFollow: Boolean, id: Int) -> Unit
) : BottomPopupView(context) {
lateinit var topAdapter: ShowFollowTopAdapter
override fun getImplLayoutId(): Int {
return R.layout.item_follow_pop
}
fun refreshData(followList: MutableList<FollowListEntity>?) {
if (this::topAdapter.isInitialized) {
topAdapter.setNewData(getUnSettlement(followList))
}
}
override fun onCreate() {
super.onCreate()
findViewById<RecyclerView>(R.id.recyclerView_top).apply {
RecyclerViewUtil.addItemDecoration(context, this, R.color.transparent, 10f)
topAdapter = ShowFollowTopAdapter().apply {
setNewData(getUnSettlement(followList))
setOnItemChildClickListener { adapter, view, position ->
when (view.id) {
R.id.tv_follow -> click(true, (adapter.getItem(position) as FollowListEntity).id)
R.id.tv_unfollow -> click(false, (adapter.getItem(position) as FollowListEntity).id)
}
}
}
adapter = topAdapter
}
findViewById<RecyclerView>(R.id.recyclerView_down).apply {
RecyclerViewUtil.addItemDecoration(context, this, R.color.transparent, 10f)
adapter = ShowFollowDownAdapter().apply {
setNewData(getSettlement(followList))
}
}
}
private fun getSettlement(followList: MutableList<FollowListEntity>?): MutableList<FollowListEntity> {
return mutableListOf<FollowListEntity>().apply {
followList?.forEach {
if (it.orderResult != 0) {
add(it)
}
}
}
}
private fun getUnSettlement(followList: MutableList<FollowListEntity>?): MutableList<FollowListEntity> {
return mutableListOf<FollowListEntity>().apply {
followList?.forEach {
if (it.orderResult == 0) {
add(it)
}
}
}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/background_f5"/>
<corners android:topLeftRadius="@dimen/dp_25" android:topRightRadius="@dimen/dp_25"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid android:color="@color/color_E5E5E5"/>
<corners android:radius="@dimen/dp_4"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#4AB1FE"/>
<corners android:radius="@dimen/dp_25"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#FF2943"/>
<corners android:radius="@dimen/dp_25"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke android:color="#FF2943" android:width="@dimen/dp_1"/>
<corners android:radius="@dimen/dp_3"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid android:color="@color/white"/>
<solid android:color="@color/background_f5"/>
<corners android:radius="@dimen/dp_16"/>
</shape>
\ No newline at end of file
......@@ -211,6 +211,18 @@
</LinearLayout>
<ImageView
android:layout_marginEnd="@dimen/dp_12"
android:layout_alignParentEnd="true"
android:layout_below="@id/mTabLayout"
android:layout_marginTop="250dp"
android:id="@+id/iv_anchor_list"
android:layout_width="@dimen/dp_50"
android:layout_height="@dimen/dp_50"
android:layout_marginBottom="@dimen/dp_5"
android:src="@mipmap/icon_anchor_list"
android:visibility="gone" />
<ImageView
android:id="@+id/iv_anim"
android:layout_width="@dimen/dp_200"
android:layout_height="@dimen/dp_200"
......
......@@ -9,11 +9,11 @@
<LinearLayout
android:layout_gravity="center"
android:layout_width="260dp"
android:layout_height="300dp"
android:layout_height="260dp"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_img"
android:scaleType="centerCrop"
android:scaleType="centerInside"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
......
......@@ -70,6 +70,8 @@
android:visibility="gone" />
<TextView
android:maxLines="3"
android:ellipsize="end"
android:layout_marginStart="@dimen/dp_5"
android:layout_toEndOf="@id/tv_userid"
android:id="@+id/tv_chatcontent"
......
......@@ -19,6 +19,7 @@
android:orientation="vertical">
<LinearLayout
android:id="@+id/ll_search"
android:layout_marginTop="@dimen/dp_10"
android:layout_marginStart="@dimen/dp_9"
android:layout_width="match_parent"
......@@ -31,23 +32,22 @@
android:layout_height="wrap_content"
android:src="@mipmap/icon_app_logo" />
<EditText
android:imeOptions="actionSearch"
android:maxLines="1"
android:id="@+id/rl_search"
<TextView
android:gravity="center_vertical"
android:singleLine="true"
android:id="@+id/et_search"
android:layout_width="0dp"
android:layout_height="@dimen/dp_29"
android:layout_marginStart="@dimen/dp_7"
android:layout_weight="1"
android:background="@drawable/shape_main_search_live"
android:drawableStart="@mipmap/icon_main_search_icon"
android:drawablePadding="@dimen/dp_10"
android:hint="房间号/房间名/主播名"
android:textColorHint="@color/color_999999"
android:textColor="@color/black"
android:text="房间号/房间名/主播名"
android:textColor="@color/color_999999"
android:paddingStart="@dimen/dp_11"
android:paddingEnd="@dimen/dp_11"
android:textSize="@dimen/sp_12" />
android:textSize="@dimen/sp_12"
app:drawableStartCompat="@mipmap/icon_main_search_icon" />
<ImageView
......
<?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:background="@mipmap/bg_follow_list"
android:layout_width="match_parent"
android:padding="@dimen/dp_10"
android:layout_height="@dimen/dp_70">
<TextView
android:paddingVertical="@dimen/dp_2"
android:paddingHorizontal="@dimen/dp_5"
tools:text="大小球"
android:textColor="#FF2943"
android:background="@drawable/shape_follow_type"
android:textSize="@dimen/sp_13"
android:id="@+id/tv_type"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_15"
android:maxLines="1"
android:textColor="#333333"
android:textSize="@dimen/sp_13"
app:layout_constraintBottom_toBottomOf="@id/tv_type"
app:layout_constraintStart_toEndOf="@id/tv_type"
app:layout_constraintTop_toTopOf="@id/tv_type"
tools:text="【全场】 墨尔本城-0.5" />
<TextView
android:id="@+id/tv_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:textColor="#666666"
android:textSize="@dimen/sp_12"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:text="0人跟单/0人反买" />
<ImageView
tools:src="@mipmap/icon_follow_black"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="@id/tv_result"
app:layout_constraintTop_toTopOf="@id/tv_name"
android:id="@+id/iv_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?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="500dp"
android:paddingBottom="@dimen/dp_25"
android:background="@drawable/shape_bg_f5"
android:paddingHorizontal="@dimen/dp_15">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="36dp"
android:gravity="center"
android:text="本场推单"
android:textColor="#333333"
android:textSize="@dimen/sp_15"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fillViewport="true"
app:layout_constraintTop_toBottomOf="@id/tv_title">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:id="@+id/recyclerView_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10"
android:nestedScrollingEnabled="false"
app:layout_constraintTop_toTopOf="parent"
tools:itemCount="2"
tools:listitem="@layout/item_follow_top" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView_down"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10"
android:nestedScrollingEnabled="false"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintTop_toBottomOf="@id/recyclerView_top"
tools:itemCount="3"
tools:listitem="@layout/item_follow">
</androidx.recyclerview.widget.RecyclerView>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?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="@mipmap/bg_follow_main_list"
android:padding="@dimen/dp_10">
<TextView
android:id="@+id/tv_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#FF2943"
android:paddingHorizontal="@dimen/dp_5"
tools:text="大小球"
android:layout_marginEnd="@dimen/dp_15"
android:textColor="@color/white"
android:textSize="@dimen/sp_15"
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:maxLines="1"
android:textColor="@color/white"
android:textSize="@dimen/sp_15"
app:layout_constraintStart_toEndOf="@id/tv_type"
app:layout_constraintTop_toTopOf="parent"
tools:text="【全场】 墨尔本城-0.5" />
<LinearLayout
android:id="@+id/ll_center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10"
android:orientation="horizontal"
app:layout_constraintTop_toBottomOf="@id/tv_name">
<View
android:id="@+id/view_start"
android:layout_width="0dp"
android:layout_height="@dimen/dp_10"
android:layout_marginEnd="-5dp"
android:layout_weight="1"
android:background="@drawable/shape_follow_start" />
<View
android:id="@+id/view_end"
android:layout_width="0dp"
android:layout_height="@dimen/dp_10"
android:layout_marginStart="-5dp"
android:layout_weight="1"
android:background="@drawable/shape_follow_end" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_15"
android:background="@mipmap/icon_follow_list_bg"
android:gravity="center"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ll_center">
<TextView
android:id="@+id/tv_follow"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:drawablePadding="@dimen/dp_5"
android:gravity="center"
android:textColor="#FF2943"
android:textSize="@dimen/sp_14"
app:drawableStartCompat="@mipmap/icon_follow_list"
tools:text="1人跟单" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_15"
android:background="@mipmap/icon_follow_list_bg"
android:gravity="center"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/ll_center">
<TextView
android:id="@+id/tv_unfollow"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:drawablePadding="@dimen/dp_5"
android:gravity="center"
android:textColor="#4AB1FE"
android:textSize="@dimen/sp_14"
app:drawableStartCompat="@mipmap/icon_unfollow_list"
tools:text="1人反买" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/tv_label"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_20"
android:background="@drawable/shape_bg_search_text"
android:gravity="center"
android:minWidth="@dimen/dp_52"
android:paddingStart="@dimen/dp_7"
android:paddingTop="@dimen/dp_2"
android:paddingEnd="@dimen/dp_7"
android:paddingBottom="@dimen/dp_2"
android:textColor="@color/color_FF4747"
android:textSize="@dimen/sp_12"
tools:text="标签标签" />
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/tv_label"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_20"
android:layout_margin="@dimen/dp_5"
android:background="@drawable/shape_bg_search_text"
android:gravity="center"
android:minWidth="@dimen/dp_52"
android:paddingStart="@dimen/dp_7"
android:paddingTop="@dimen/dp_2"
android:paddingEnd="@dimen/dp_7"
android:paddingBottom="@dimen/dp_2"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp_12"
tools:text="标签标签" />
\ No newline at end of file
app/src/main/res/mipmap-xhdpi/ee_10.png

1.76 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_10.png

7.97 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_10.png
app/src/main/res/mipmap-xhdpi/ee_10.png
app/src/main/res/mipmap-xhdpi/ee_10.png
app/src/main/res/mipmap-xhdpi/ee_10.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_11.png

1.79 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_11.png

8.16 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_11.png
app/src/main/res/mipmap-xhdpi/ee_11.png
app/src/main/res/mipmap-xhdpi/ee_11.png
app/src/main/res/mipmap-xhdpi/ee_11.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_12.png

1.95 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_12.png

8.55 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_12.png
app/src/main/res/mipmap-xhdpi/ee_12.png
app/src/main/res/mipmap-xhdpi/ee_12.png
app/src/main/res/mipmap-xhdpi/ee_12.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_14.png

1.75 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_14.png

8.28 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_14.png
app/src/main/res/mipmap-xhdpi/ee_14.png
app/src/main/res/mipmap-xhdpi/ee_14.png
app/src/main/res/mipmap-xhdpi/ee_14.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_15.png

1.84 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_15.png

8.95 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_15.png
app/src/main/res/mipmap-xhdpi/ee_15.png
app/src/main/res/mipmap-xhdpi/ee_15.png
app/src/main/res/mipmap-xhdpi/ee_15.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_18.png

1.75 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_18.png

8.61 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_18.png
app/src/main/res/mipmap-xhdpi/ee_18.png
app/src/main/res/mipmap-xhdpi/ee_18.png
app/src/main/res/mipmap-xhdpi/ee_18.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_19.png

1.83 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_19.png

6.86 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_19.png
app/src/main/res/mipmap-xhdpi/ee_19.png
app/src/main/res/mipmap-xhdpi/ee_19.png
app/src/main/res/mipmap-xhdpi/ee_19.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_2.png

1.86 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_2.png

7.95 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_2.png
app/src/main/res/mipmap-xhdpi/ee_2.png
app/src/main/res/mipmap-xhdpi/ee_2.png
app/src/main/res/mipmap-xhdpi/ee_2.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_21.png

1.91 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_21.png

5.62 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_21.png
app/src/main/res/mipmap-xhdpi/ee_21.png
app/src/main/res/mipmap-xhdpi/ee_21.png
app/src/main/res/mipmap-xhdpi/ee_21.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_22.png

1.87 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_22.png

8.76 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_22.png
app/src/main/res/mipmap-xhdpi/ee_22.png
app/src/main/res/mipmap-xhdpi/ee_22.png
app/src/main/res/mipmap-xhdpi/ee_22.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_23.png

1.82 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_23.png

8.08 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_23.png
app/src/main/res/mipmap-xhdpi/ee_23.png
app/src/main/res/mipmap-xhdpi/ee_23.png
app/src/main/res/mipmap-xhdpi/ee_23.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_24.png

1.09 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_24.png

9.12 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_24.png
app/src/main/res/mipmap-xhdpi/ee_24.png
app/src/main/res/mipmap-xhdpi/ee_24.png
app/src/main/res/mipmap-xhdpi/ee_24.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_25.png

1.28 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_25.png

8.24 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_25.png
app/src/main/res/mipmap-xhdpi/ee_25.png
app/src/main/res/mipmap-xhdpi/ee_25.png
app/src/main/res/mipmap-xhdpi/ee_25.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_27.png

1.01 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_27.png

8.35 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_27.png
app/src/main/res/mipmap-xhdpi/ee_27.png
app/src/main/res/mipmap-xhdpi/ee_27.png
app/src/main/res/mipmap-xhdpi/ee_27.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_28.png

1.35 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_28.png

8.46 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_28.png
app/src/main/res/mipmap-xhdpi/ee_28.png
app/src/main/res/mipmap-xhdpi/ee_28.png
app/src/main/res/mipmap-xhdpi/ee_28.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_29.png

2.16 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_29.png

9.55 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_29.png
app/src/main/res/mipmap-xhdpi/ee_29.png
app/src/main/res/mipmap-xhdpi/ee_29.png
app/src/main/res/mipmap-xhdpi/ee_29.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_3.png

1.79 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_3.png

7.64 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_3.png
app/src/main/res/mipmap-xhdpi/ee_3.png
app/src/main/res/mipmap-xhdpi/ee_3.png
app/src/main/res/mipmap-xhdpi/ee_3.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_30.png

2.01 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_30.png

8.15 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_30.png
app/src/main/res/mipmap-xhdpi/ee_30.png
app/src/main/res/mipmap-xhdpi/ee_30.png
app/src/main/res/mipmap-xhdpi/ee_30.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_32.png

1.05 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_32.png

9.28 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_32.png
app/src/main/res/mipmap-xhdpi/ee_32.png
app/src/main/res/mipmap-xhdpi/ee_32.png
app/src/main/res/mipmap-xhdpi/ee_32.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_33.png

1.08 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_33.png

8.87 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_33.png
app/src/main/res/mipmap-xhdpi/ee_33.png
app/src/main/res/mipmap-xhdpi/ee_33.png
app/src/main/res/mipmap-xhdpi/ee_33.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_34.png

1.21 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_34.png

7.78 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_34.png
app/src/main/res/mipmap-xhdpi/ee_34.png
app/src/main/res/mipmap-xhdpi/ee_34.png
app/src/main/res/mipmap-xhdpi/ee_34.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_35.png

990 Bytes | W: | H:

app/src/main/res/mipmap-xhdpi/ee_35.png

8.04 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_35.png
app/src/main/res/mipmap-xhdpi/ee_35.png
app/src/main/res/mipmap-xhdpi/ee_35.png
app/src/main/res/mipmap-xhdpi/ee_35.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_4.png

2.07 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_4.png

10.1 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_4.png
app/src/main/res/mipmap-xhdpi/ee_4.png
app/src/main/res/mipmap-xhdpi/ee_4.png
app/src/main/res/mipmap-xhdpi/ee_4.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_5.png

1.92 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_5.png

8.22 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_5.png
app/src/main/res/mipmap-xhdpi/ee_5.png
app/src/main/res/mipmap-xhdpi/ee_5.png
app/src/main/res/mipmap-xhdpi/ee_5.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_6.png

1.85 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_6.png

7.75 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_6.png
app/src/main/res/mipmap-xhdpi/ee_6.png
app/src/main/res/mipmap-xhdpi/ee_6.png
app/src/main/res/mipmap-xhdpi/ee_6.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_7.png

1.85 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_7.png

8.36 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_7.png
app/src/main/res/mipmap-xhdpi/ee_7.png
app/src/main/res/mipmap-xhdpi/ee_7.png
app/src/main/res/mipmap-xhdpi/ee_7.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_8.png

1.86 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_8.png

8.55 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_8.png
app/src/main/res/mipmap-xhdpi/ee_8.png
app/src/main/res/mipmap-xhdpi/ee_8.png
app/src/main/res/mipmap-xhdpi/ee_8.png
  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/mipmap-xhdpi/ee_9.png

1.95 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_9.png

5.94 KB | W: | H:

app/src/main/res/mipmap-xhdpi/ee_9.png
app/src/main/res/mipmap-xhdpi/ee_9.png
app/src/main/res/mipmap-xhdpi/ee_9.png
app/src/main/res/mipmap-xhdpi/ee_9.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -11,6 +11,7 @@
<color name="main_color_new">#F6F7F8</color>
<color name="item_buy_vip_normal">#13203B</color>
<color name="item_buy_vip_select">#646C72</color>
<color name="bg_share_code">#181C1F</color>
<color name="view_withdraw">#F4F4F4</color>
<color name="item_buy_vip_select_stroke">#EBC487</color>
......@@ -164,4 +165,11 @@
<color name="white_3">#08FFFFFF</color>
<color name="white_8">#14FFFFFF</color>
<color name="color_E5E5E5">#E5E5E5</color>
<color name="color_333333">#333333</color>
<color name="color_A7A7A7">#A7A7A7</color>
<color name="color_FF4747">#FF4747</color>
<color name="color_9B9B9B">#9B9B9B</color>
</resources>
......@@ -56,6 +56,9 @@ object RecyclerViewUtil {
fun addItemDecoration(activity:Activity,recyclerView: RecyclerView, @ColorRes id: Int, dp: Float, mOrientation :Int = OrientationHelper.VERTICAL) {
recyclerView.addItemDecoration(ColorDividerDecoration(mOrientation, ContextCompat.getColor(activity, id), dip2px(activity, dp)))
}
fun addItemDecoration(context:Context,recyclerView: RecyclerView, @ColorRes id: Int, dp: Float, mOrientation :Int = OrientationHelper.VERTICAL) {
recyclerView.addItemDecoration(ColorDividerDecoration(mOrientation, ContextCompat.getColor(context, id), dip2px(context, dp)))
}
fun addItemDecorationPx(activity:Activity,recyclerView: RecyclerView, @ColorRes id: Int, px: Int, mOrientation :Int = OrientationHelper.VERTICAL) {
recyclerView.addItemDecoration(ColorDividerDecoration(mOrientation, ContextCompat.getColor(activity, id), px))
}
......
......@@ -5,8 +5,8 @@ ext {
ver = [
//Version
versionCode : 14,
versionName : "1.0.3",
versionCode : 15,
versionName : "1.0.4",
//SDK And Tools
minSdkVersion : 23,
......@@ -29,7 +29,7 @@ ext {
okio : '1.14.0',
okhttp : '3.10.0',
gson : '2.8.2',
glide : '4.9.0',
glide : '4.12.0',
autosize : '1.1.0',
]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment