房间相册 列表,上传 数据对接
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
package com.yizhuan.erban.avroom.bean
|
||||
|
||||
data class RoomAlbumPhotoInfo(
|
||||
val giftId: Int,
|
||||
val giftNum: Int,
|
||||
val giftUrl: String,
|
||||
val id: Int,
|
||||
val photoUrl: String,
|
||||
val roomUid: Int,
|
||||
val status: Int,
|
||||
val totalGoldPrice: Int,
|
||||
val type: Int,
|
||||
val uid: Int
|
||||
)
|
@@ -47,6 +47,8 @@ class RoomAlbumActivity : BaseViewBindingActivity<ActivityRoomAlbumBinding>() {
|
||||
normalColor = ContextCompat.getColor(context, R.color.color_767585)
|
||||
selectedColor = ContextCompat.getColor(context, R.color.color_1F1B4F)
|
||||
text = titles[index]
|
||||
}.apply {
|
||||
setOnClickListener { binding.vp.currentItem = index }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,9 +82,9 @@ class RoomAlbumActivity : BaseViewBindingActivity<ActivityRoomAlbumBinding>() {
|
||||
ViewPagerHelper.bind(binding.indicator, binding.vp)
|
||||
|
||||
val fragments = listOf(
|
||||
RoomAlbumFragment.newInstance(),
|
||||
RoomAlbumFragment.newInstance(),
|
||||
RoomAlbumFragment.newInstance()
|
||||
RoomAlbumFragment.newInstance(RoomAlbumFragment.TYPE_MINE),
|
||||
RoomAlbumFragment.newInstance(RoomAlbumFragment.TYPE_COMMON),
|
||||
RoomAlbumFragment.newInstance(RoomAlbumFragment.TYPE_LOCKED)
|
||||
)
|
||||
|
||||
binding.vp.adapter = object : FragmentStateAdapter(this) {
|
||||
@@ -96,9 +98,12 @@ class RoomAlbumActivity : BaseViewBindingActivity<ActivityRoomAlbumBinding>() {
|
||||
}
|
||||
|
||||
binding.tvUpload.setOnClickListener {
|
||||
UploadRoomAlbumDialogFragment().show(supportFragmentManager, UploadRoomAlbumDialogFragment::class.java.simpleName)
|
||||
UploadRoomAlbumDialogFragment().show(
|
||||
supportFragmentManager,
|
||||
UploadRoomAlbumDialogFragment::class.java.simpleName
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
|
@@ -1,20 +1,34 @@
|
||||
package com.yizhuan.erban.avroom.room_album
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ImageView
|
||||
import androidx.fragment.app.activityViewModels
|
||||
import androidx.fragment.app.viewModels
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter
|
||||
import com.chad.library.adapter.base.BaseViewHolder
|
||||
import com.chad.library.adapter.base.diff.BaseQuickDiffCallback
|
||||
import com.yizhuan.erban.R
|
||||
import com.yizhuan.erban.avroom.bean.RoomAlbumPhotoInfo
|
||||
import com.yizhuan.erban.base.BaseViewBindingFragment
|
||||
import com.yizhuan.erban.databinding.FragmentRoomAlbumBinding
|
||||
import com.yizhuan.erban.ui.utils.ImageLoadUtils
|
||||
import com.yizhuan.erban.ui.utils.ImageLoadUtilsV2
|
||||
import com.yizhuan.erban.ui.widget.ButtonItem
|
||||
import com.yizhuan.erban.ui.widget.recyclerview.decoration.GridSpacingItemNewDecoration
|
||||
import com.yizhuan.xchat_android_core.Constants
|
||||
|
||||
class RoomAlbumFragment : BaseViewBindingFragment<FragmentRoomAlbumBinding>() {
|
||||
|
||||
private val viewModel by activityViewModels<RoomAlbumViewModel>()
|
||||
private val activityViewModel by activityViewModels<RoomAlbumViewModel>()
|
||||
private val viewModel by viewModels<RoomAlbumFragmentViewModel>()
|
||||
|
||||
private val type: Int by lazy {
|
||||
requireArguments().getInt("type")
|
||||
}
|
||||
|
||||
private var page = 1
|
||||
|
||||
override fun init() {
|
||||
binding.recyclerView.layoutManager = GridLayoutManager(context, 2)
|
||||
@@ -26,49 +40,101 @@ class RoomAlbumFragment : BaseViewBindingFragment<FragmentRoomAlbumBinding>() {
|
||||
true
|
||||
)
|
||||
)
|
||||
binding.recyclerView.adapter =
|
||||
object : BaseQuickAdapter<String, BaseViewHolder>(R.layout.item_room_album) {
|
||||
override fun convert(helper: BaseViewHolder, item: String) {
|
||||
val adapter = object :
|
||||
BaseQuickAdapter<RoomAlbumPhotoInfo, BaseViewHolder>(R.layout.item_room_album) {
|
||||
override fun convert(helper: BaseViewHolder, item: RoomAlbumPhotoInfo) {
|
||||
val ivPhoto = helper.getView<ImageView>(R.id.iv_pic)
|
||||
if (item.status == 1) {
|
||||
ImageLoadUtilsV2.loadImage(ivPhoto, item.photoUrl)
|
||||
} else {
|
||||
ImageLoadUtils.loadImageWithBlur(
|
||||
context,
|
||||
item,
|
||||
helper.getView(R.id.iv_pic),
|
||||
item.photoUrl,
|
||||
ivPhoto,
|
||||
25, 4
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreateDefViewHolder(
|
||||
parent: ViewGroup?,
|
||||
viewType: Int
|
||||
): BaseViewHolder {
|
||||
val holder = super.onCreateDefViewHolder(parent, viewType)
|
||||
holder.addOnClickListener(R.id.v_action)
|
||||
return holder
|
||||
}
|
||||
|
||||
}.apply {
|
||||
setEnableLoadMore(true)
|
||||
setOnLoadMoreListener({
|
||||
viewModel.loadPhotos(type, page++)
|
||||
}, binding.recyclerView)
|
||||
|
||||
setOnItemChildClickListener { _, view, position ->
|
||||
if (view.id == R.id.v_action) {
|
||||
val buttonItems = listOf(
|
||||
ButtonItem("發送到公屏", {}),
|
||||
ButtonItem("刪除照片", {}),
|
||||
ButtonItem("查看大圖", {})
|
||||
)
|
||||
dialogManager.showCommonPopupDialog(buttonItems)
|
||||
|
||||
override fun onCreateDefViewHolder(
|
||||
parent: ViewGroup?,
|
||||
viewType: Int
|
||||
): BaseViewHolder {
|
||||
val holder = super.onCreateDefViewHolder(parent, viewType)
|
||||
holder.addOnClickListener(R.id.v_action)
|
||||
return holder
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}.apply {
|
||||
binding.recyclerView.adapter = adapter
|
||||
|
||||
viewModel.myPhotosLiveData.observe(this@RoomAlbumFragment) {
|
||||
setNewData(it)
|
||||
}
|
||||
binding.refreshLayout.setOnRefreshListener {
|
||||
page = Constants.PAGE_START
|
||||
viewModel.loadPhotos(type)
|
||||
}
|
||||
|
||||
setOnItemChildClickListener { _, view, position ->
|
||||
if (view.id == R.id.v_action) {
|
||||
val buttonItems = listOf(
|
||||
ButtonItem("發送到公屏", {}),
|
||||
ButtonItem("刪除照片", {}),
|
||||
ButtonItem("查看大圖", {})
|
||||
)
|
||||
dialogManager.showCommonPopupDialog(buttonItems)
|
||||
viewModel.loadPhotos(type)
|
||||
|
||||
}
|
||||
activityViewModel.uploadLiveData.observe(this) {
|
||||
page = Constants.PAGE_START
|
||||
viewModel.loadPhotos(type)
|
||||
}
|
||||
|
||||
viewModel.myPhotosLiveData.observe(this@RoomAlbumFragment) {
|
||||
it?.let { list ->
|
||||
adapter.loadMoreComplete()
|
||||
if (list.size - adapter.data.size < Constants.PAGE_SIZE) {
|
||||
adapter.loadMoreEnd()
|
||||
}
|
||||
}
|
||||
|
||||
adapter.setNewDiffData(object : BaseQuickDiffCallback<RoomAlbumPhotoInfo>(it) {
|
||||
override fun areItemsTheSame(
|
||||
oldItem: RoomAlbumPhotoInfo,
|
||||
newItem: RoomAlbumPhotoInfo
|
||||
): Boolean {
|
||||
return oldItem.id == newItem.id
|
||||
}
|
||||
|
||||
override fun areContentsTheSame(
|
||||
oldItem: RoomAlbumPhotoInfo,
|
||||
newItem: RoomAlbumPhotoInfo
|
||||
): Boolean {
|
||||
return oldItem.photoUrl === newItem.photoUrl
|
||||
}
|
||||
})
|
||||
|
||||
binding.refreshLayout.finishRefresh()
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun newInstance() = RoomAlbumFragment()
|
||||
const val TYPE_MINE = 0
|
||||
const val TYPE_COMMON = 1
|
||||
const val TYPE_LOCKED = 2
|
||||
fun newInstance(type: Int) = RoomAlbumFragment().apply {
|
||||
arguments = Bundle().apply {
|
||||
putInt("type", type)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,28 @@
|
||||
package com.yizhuan.erban.avroom.room_album
|
||||
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import com.yizhuan.erban.avroom.bean.RoomAlbumPhotoInfo
|
||||
import com.yizhuan.erban.base.BaseViewModel
|
||||
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager
|
||||
|
||||
class RoomAlbumFragmentViewModel : BaseViewModel() {
|
||||
|
||||
private val _myPhotosLiveData = MutableLiveData<MutableList<RoomAlbumPhotoInfo>?>()
|
||||
val myPhotosLiveData: LiveData<MutableList<RoomAlbumPhotoInfo>?> = _myPhotosLiveData
|
||||
|
||||
fun loadPhotos(type: Int, page: Int = 1) {
|
||||
safeLaunch {
|
||||
val myPhotos = RoomAlbumModel.loadPhotos(AvRoomDataManager.get().roomUid, type, page)
|
||||
|
||||
val value = _myPhotosLiveData.value
|
||||
if (page == 1) {
|
||||
_myPhotosLiveData.value = myPhotos!!.toMutableList()
|
||||
return@safeLaunch
|
||||
}
|
||||
|
||||
value?.addAll(myPhotos!!)
|
||||
_myPhotosLiveData.value = value
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,48 @@
|
||||
package com.yizhuan.erban.avroom.room_album
|
||||
|
||||
import com.yizhuan.erban.avroom.bean.RoomAlbumPhotoInfo
|
||||
import com.yizhuan.xchat_android_core.Constants
|
||||
import com.yizhuan.xchat_android_core.bean.response.ServiceResult
|
||||
import com.yizhuan.xchat_android_core.utils.net.launchRequest
|
||||
import com.yizhuan.xchat_android_library.net.rxnet.RxNet
|
||||
import retrofit2.http.Field
|
||||
import retrofit2.http.FormUrlEncoded
|
||||
import retrofit2.http.GET
|
||||
import retrofit2.http.POST
|
||||
import retrofit2.http.Query
|
||||
|
||||
object RoomAlbumModel {
|
||||
private val api = RxNet.create(Api::class.java)
|
||||
|
||||
suspend fun loadPhotos(roomUid: Long, type: Int, page: Int): List<RoomAlbumPhotoInfo>? {
|
||||
return launchRequest {
|
||||
api.loadPhotos(roomUid, type, page, Constants.PAGE_SIZE)
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun uploadPhotos(roomUid: Long, type: Int, photoUrls: String, giftId: Int?) : String? {
|
||||
return launchRequest {
|
||||
api.uploadPhotos(roomUid, type, photoUrls, giftId)
|
||||
}
|
||||
}
|
||||
|
||||
private interface Api {
|
||||
|
||||
@GET("roomAlbum/pagePhoto")
|
||||
suspend fun loadPhotos(
|
||||
@Query("roomUid") roomUid: Long,
|
||||
@Query("type") type: Int,
|
||||
@Query("page") page: Int,
|
||||
@Query("pageSize") pageSize: Int,
|
||||
): ServiceResult<List<RoomAlbumPhotoInfo>>
|
||||
|
||||
@FormUrlEncoded
|
||||
@POST("roomAlbum/upload")
|
||||
suspend fun uploadPhotos(
|
||||
@Field("roomUid") roomUid: Long,
|
||||
@Field("type") type: Int,
|
||||
@Field("photoUrls") photoUrls: String,
|
||||
@Field("giftId") giftId: Int?,
|
||||
): ServiceResult<String>
|
||||
}
|
||||
}
|
@@ -1,26 +1,48 @@
|
||||
package com.yizhuan.erban.avroom.room_album
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import com.yizhuan.erban.base.BaseViewModel
|
||||
import com.yizhuan.erban.base.Event
|
||||
import com.yizhuan.xchat_android_core.file.FileModel
|
||||
import com.yizhuan.xchat_android_core.gift.bean.GiftInfo
|
||||
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager
|
||||
import com.yizhuan.xchat_android_core.utils.toast
|
||||
import io.reactivex.Observable
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
|
||||
class RoomAlbumViewModel : BaseViewModel() {
|
||||
|
||||
private val _myPhotosLiveData = MutableLiveData<MutableList<String>>()
|
||||
val myPhotosLiveData: LiveData<MutableList<String>> = _myPhotosLiveData
|
||||
|
||||
init {
|
||||
loadMyPhotos()
|
||||
}
|
||||
private val _uploadLiveData = MutableLiveData<Event<Boolean>>()
|
||||
val uploadLiveData: LiveData<Event<Boolean>?> = _uploadLiveData
|
||||
|
||||
fun loadMyPhotos() {
|
||||
safeLaunch {
|
||||
val list = mutableListOf<String>()
|
||||
for (i in 0 until 20) {
|
||||
list.add("https://image.hfighting.com/FsElQzIALqAixbAT56riNMotkAZR")
|
||||
@SuppressLint("CheckResult")
|
||||
fun upload(list: MutableList<String>, type: Int, unlockedGift: GiftInfo?) {
|
||||
Observable.fromIterable(list)
|
||||
.flatMap {
|
||||
FileModel.get().uploadFile(it).toObservable()
|
||||
}
|
||||
|
||||
_myPhotosLiveData.value = list
|
||||
}
|
||||
.toList()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe({
|
||||
safeLaunch(onError = {
|
||||
_uploadLiveData.value = Event(false)
|
||||
}, block = {
|
||||
RoomAlbumModel.uploadPhotos(
|
||||
AvRoomDataManager.get().roomUid,
|
||||
type,
|
||||
it.joinToString(),
|
||||
unlockedGift?.giftId
|
||||
)
|
||||
_uploadLiveData.value = Event(true)
|
||||
})
|
||||
}, {
|
||||
it.message.toast()
|
||||
_uploadLiveData.value = Event(false)
|
||||
})
|
||||
}
|
||||
}
|
@@ -11,11 +11,14 @@ import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.WindowManager
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.fragment.app.activityViewModels
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter
|
||||
import com.chad.library.adapter.base.BaseViewHolder
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
import com.hjq.toast.ToastUtils
|
||||
import com.yizhuan.erban.R
|
||||
import com.yizhuan.erban.common.widget.dialog.DialogManager
|
||||
import com.yizhuan.erban.databinding.DialogRoomAlbumUploadBinding
|
||||
import com.yizhuan.erban.ui.utils.ImageLoadUtilsV2
|
||||
import com.yizhuan.erban.ui.widget.recyclerview.decoration.GridSpacingItemNewDecoration
|
||||
@@ -29,10 +32,16 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
|
||||
private var _binding: DialogRoomAlbumUploadBinding? = null
|
||||
private val binding get() = _binding!!
|
||||
|
||||
private val viewModel by activityViewModels<RoomAlbumViewModel>()
|
||||
|
||||
private lateinit var photoAdapter: BaseMultiItemQuickAdapter<PhotoItem, BaseViewHolder>
|
||||
|
||||
private var unlockedGift: GiftInfo? = null
|
||||
|
||||
val dialogManager by lazy {
|
||||
DialogManager(context)
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setStyle(STYLE_NO_TITLE, R.style.ErbanBottomSheetDialog)
|
||||
@@ -120,7 +129,12 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
|
||||
unlockedGift = null
|
||||
|
||||
binding.vGift.isEnabled = false
|
||||
binding.tvGiftLabel.setTextColor(ContextCompat.getColor(requireContext(), R.color.color_B3B3C3))
|
||||
binding.tvGiftLabel.setTextColor(
|
||||
ContextCompat.getColor(
|
||||
requireContext(),
|
||||
R.color.color_B3B3C3
|
||||
)
|
||||
)
|
||||
} else {
|
||||
binding.tvNoGift.visibility = View.VISIBLE
|
||||
binding.tvNoGift.text =
|
||||
@@ -128,7 +142,12 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
|
||||
|
||||
binding.groupGift.visibility = View.INVISIBLE
|
||||
binding.vGift.isEnabled = true
|
||||
binding.tvGiftLabel.setTextColor(ContextCompat.getColor(requireContext(), R.color.color_1F1B4F))
|
||||
binding.tvGiftLabel.setTextColor(
|
||||
ContextCompat.getColor(
|
||||
requireContext(),
|
||||
R.color.color_1F1B4F
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,6 +170,43 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
|
||||
)
|
||||
}
|
||||
|
||||
binding.slConfirm.setOnClickListener {
|
||||
val list = mutableListOf<String>()
|
||||
photoAdapter.data.forEach {
|
||||
if (it.type == PhotoItem.TYPE_PHOTO) {
|
||||
list.add(it.path)
|
||||
}
|
||||
}
|
||||
if (list.size < 1) {
|
||||
ToastUtils.show("未選擇圖片")
|
||||
return@setOnClickListener
|
||||
}
|
||||
|
||||
val type = if (binding.rgType.checkedRadioButtonId == binding.rbCommon.id) 1 else 2
|
||||
if (type == 2 && unlockedGift == null) {
|
||||
ToastUtils.show("未選擇解鎖禮物")
|
||||
return@setOnClickListener
|
||||
}
|
||||
|
||||
dialogManager.showProgressDialog(context)
|
||||
viewModel.upload(
|
||||
list,
|
||||
type,
|
||||
unlockedGift
|
||||
)
|
||||
}
|
||||
|
||||
viewModel.uploadLiveData.observe(this) {
|
||||
it?.getContentIfNotHandled()?.let { success ->
|
||||
dialogManager.hideProgressDialog()
|
||||
|
||||
if (success) {
|
||||
dismiss()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
binding.ivClose.setOnClickListener { dismiss() }
|
||||
|
||||
return binding.root
|
||||
|
@@ -1,8 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/recycler_view"
|
||||
<com.scwang.smartrefresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/refresh_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fadingEdge="vertical"
|
||||
android:fadingEdgeLength="@dimen/dp_60"
|
||||
android:requiresFadingEdge="vertical" />
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/recycler_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fadingEdge="vertical"
|
||||
android:fadingEdgeLength="@dimen/dp_60"
|
||||
android:requiresFadingEdge="vertical" />
|
||||
|
||||
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
|
Reference in New Issue
Block a user