From 5640a28fdbbd15131f281b2c08af84eaee76aca8 Mon Sep 17 00:00:00 2001 From: klaus Date: Fri, 29 Nov 2024 15:34:18 +0900 Subject: [PATCH] =?UTF-8?q?=EB=82=B4=20=EB=B3=B4=EA=B4=80=ED=95=A8=20-=20?= =?UTF-8?q?=EA=B5=AC=EB=A7=A4=EB=AA=A9=EB=A1=9D=20UI=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../box/AudioContentBoxActivity.kt | 11 +- .../order/AudioContentOrderListFragment.kt | 128 ++++++++++++++++++ .../fragment_audio_content_order_list.xml | 52 +++++++ 3 files changed, 187 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/audio_content/order/AudioContentOrderListFragment.kt create mode 100644 app/src/main/res/layout/fragment_audio_content_order_list.xml diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/box/AudioContentBoxActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/box/AudioContentBoxActivity.kt index 8e98a76..dde710e 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/box/AudioContentBoxActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/box/AudioContentBoxActivity.kt @@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.audio_content.box import android.widget.LinearLayout import com.google.android.material.tabs.TabLayout import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.audio_content.order.AudioContentOrderListFragment import kr.co.vividnext.sodalive.audio_content.playlist.AudioContentPlaylistListFragment import kr.co.vividnext.sodalive.base.BaseActivity import kr.co.vividnext.sodalive.databinding.ActivityAudioContentBoxBinding @@ -15,7 +16,7 @@ class AudioContentBoxActivity : BaseActivity( setupTabs() supportFragmentManager.beginTransaction() - .replace(R.id.fl_container, AudioContentPlaylistListFragment()) + .replace(R.id.fl_container, AudioContentOrderListFragment()) .commit() } @@ -26,19 +27,21 @@ class AudioContentBoxActivity : BaseActivity( private fun setupTabs() { val tabs = binding.tabs - tabs.addTab(tabs.newTab().setText("재생목록")) tabs.addTab(tabs.newTab().setText("구매목록")) + tabs.addTab(tabs.newTab().setText("재생목록")) tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { tab.view.isSelected = true when (tab.position) { - 0 -> supportFragmentManager.beginTransaction() + 1 -> supportFragmentManager.beginTransaction() .replace(R.id.fl_container, AudioContentPlaylistListFragment()) .commit() - 1 -> {} + else -> supportFragmentManager.beginTransaction() + .replace(R.id.fl_container, AudioContentOrderListFragment()) + .commit() } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/order/AudioContentOrderListFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/order/AudioContentOrderListFragment.kt new file mode 100644 index 0000000..e5dd1f3 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/order/AudioContentOrderListFragment.kt @@ -0,0 +1,128 @@ +package kr.co.vividnext.sodalive.audio_content.order + +import android.annotation.SuppressLint +import android.content.Intent +import android.graphics.Rect +import android.os.Bundle +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity +import kr.co.vividnext.sodalive.base.BaseFragment +import kr.co.vividnext.sodalive.common.Constants +import kr.co.vividnext.sodalive.common.LoadingDialog +import kr.co.vividnext.sodalive.databinding.FragmentAudioContentOrderListBinding +import kr.co.vividnext.sodalive.extensions.dpToPx +import org.koin.android.ext.android.inject + +class AudioContentOrderListFragment : BaseFragment( + FragmentAudioContentOrderListBinding::inflate +) { + private val viewModel: AudioContentOrderListViewModel by inject() + + private lateinit var loadingDialog: LoadingDialog + private lateinit var adapter: AudioContentOrderListAdapter + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + setupView() + bindData() + viewModel.getAudioContentOrderList { requireActivity().finish() } + } + + fun setupView() { + loadingDialog = LoadingDialog(requireActivity(), layoutInflater) + + adapter = AudioContentOrderListAdapter { + startActivity( + Intent(requireContext(), AudioContentDetailActivity::class.java) + .apply { putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it) } + ) + } + + binding.rvOrderList.layoutManager = LinearLayoutManager( + requireContext(), + LinearLayoutManager.VERTICAL, + false + ) + + binding.rvOrderList.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + + outRect.left = 13.3f.dpToPx().toInt() + outRect.right = 13.3f.dpToPx().toInt() + + when (parent.getChildAdapterPosition(view)) { + 0 -> { + outRect.top = 13.3f.dpToPx().toInt() + outRect.bottom = 6.7f.dpToPx().toInt() + } + + adapter.itemCount - 1 -> { + outRect.top = 6.7f.dpToPx().toInt() + outRect.bottom = 13.3f.dpToPx().toInt() + } + + else -> { + outRect.top = 6.7f.dpToPx().toInt() + outRect.bottom = 6.7f.dpToPx().toInt() + } + } + } + }) + + binding.rvOrderList.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val lastVisibleItemPosition = (recyclerView.layoutManager as LinearLayoutManager?)!! + .findLastCompletelyVisibleItemPosition() + val itemTotalCount = recyclerView.adapter!!.itemCount - 1 + + // 스크롤이 끝에 도달했는지 확인 + if (!recyclerView.canScrollVertically(1) && + lastVisibleItemPosition == itemTotalCount + ) { + viewModel.getAudioContentOrderList {} + } + } + }) + + binding.rvOrderList.adapter = adapter + } + + @SuppressLint("NotifyDataSetChanged") + private fun bindData() { + viewModel.toastLiveData.observe(viewLifecycleOwner) { + it?.let { showToast(it) } + } + + viewModel.isLoading.observe(viewLifecycleOwner) { + if (it) { + loadingDialog.show(screenWidth, "") + } else { + loadingDialog.dismiss() + } + } + + viewModel.orderList.observe(viewLifecycleOwner) { + if (viewModel.page == 2) { + adapter.items.clear() + } + + adapter.items.addAll(it) + adapter.notifyDataSetChanged() + } + + viewModel.totalCount.observe(viewLifecycleOwner) { + binding.tvTotalCount.text = "$it" + } + } +} diff --git a/app/src/main/res/layout/fragment_audio_content_order_list.xml b/app/src/main/res/layout/fragment_audio_content_order_list.xml new file mode 100644 index 0000000..9972de8 --- /dev/null +++ b/app/src/main/res/layout/fragment_audio_content_order_list.xml @@ -0,0 +1,52 @@ + + + + + + + + + + +