From 32c956c7b46ea20e56ebb7a545fea4f0da0f81ca Mon Sep 17 00:00:00 2001 From: noion0511 Date: Sun, 13 Aug 2023 20:55:14 +0900 Subject: [PATCH] =?UTF-8?q?fix=20:=20=EC=97=B0=EC=86=8D=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 1초 안에 여러번 클릭해서 발생하는 오류제어를 위해서 버튼 클릭을 1초에 1회로 한정 --- .../ui/board/BoardDetailFragment.kt | 67 ++++++++++++------- .../ui/board/BoardWriteFragment.kt | 22 +++--- .../util/DebouncingClickListener.kt | 20 ++++++ .../main/res/layout/fragment_board_detail.xml | 1 - 4 files changed, 77 insertions(+), 33 deletions(-) create mode 100644 app/src/main/java/com/ssafy/gumi_life_project/util/DebouncingClickListener.kt diff --git a/app/src/main/java/com/ssafy/gumi_life_project/ui/board/BoardDetailFragment.kt b/app/src/main/java/com/ssafy/gumi_life_project/ui/board/BoardDetailFragment.kt index 1238ac7..8b7074f 100644 --- a/app/src/main/java/com/ssafy/gumi_life_project/ui/board/BoardDetailFragment.kt +++ b/app/src/main/java/com/ssafy/gumi_life_project/ui/board/BoardDetailFragment.kt @@ -10,10 +10,13 @@ import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import com.ssafy.gumi_life_project.R import com.ssafy.gumi_life_project.data.local.AppPreferences -import com.ssafy.gumi_life_project.data.model.* +import com.ssafy.gumi_life_project.data.model.BoardItem +import com.ssafy.gumi_life_project.data.model.Comment +import com.ssafy.gumi_life_project.data.model.CommentDto +import com.ssafy.gumi_life_project.data.model.ReplyDto import com.ssafy.gumi_life_project.databinding.FragmentBoardDetailBinding import com.ssafy.gumi_life_project.ui.board.comment.CommentAdapter -import com.ssafy.gumi_life_project.ui.main.LoadingDialog +import com.ssafy.gumi_life_project.util.DebouncingClickListener import com.ssafy.gumi_life_project.util.showDialog import com.ssafy.gumi_life_project.util.template.BaseFragment import dagger.hilt.android.AndroidEntryPoint @@ -68,18 +71,22 @@ class BoardDetailFragment : BaseFragment( commentAdapter.onReportClick = { viewModel.setReport(it) - val bottomSheetReport =ReportBottomSheet() + val bottomSheetReport = ReportBottomSheet() bottomSheetReport.show(childFragmentManager, "ReportBottomSheet") } - bindingNonNull.imageviewHeart.setOnClickListener { - if (boardItem.boardNo.isBlank()) return@setOnClickListener - if (likeStatus) { - viewModel.deleteLike(boardItem.boardNo) - } else { - viewModel.updateLike(boardItem.boardNo) + bindingNonNull.imageviewHeart.setOnClickListener(object : DebouncingClickListener() { + override fun onDebouncedClick(v: View) { + if (boardItem.boardNo.isBlank()) return + if (likeStatus) { + viewModel.deleteLike(boardItem.boardNo) + } else { + viewModel.updateLike(boardItem.boardNo) + } } - } + }) + + initCreateCommentButton() } @@ -130,7 +137,11 @@ class BoardDetailFragment : BaseFragment( true } R.id.button_board_delete -> { - showDialog(requireContext(), getString(R.string.board_delete_notice), getString(R.string.board_delete_ok)) { + showDialog( + requireContext(), + getString(R.string.board_delete_notice), + getString(R.string.board_delete_ok) + ) { viewModel.deleteBoard(boardItem.boardNo, boardItem.writerId.toString()) } true @@ -146,18 +157,23 @@ class BoardDetailFragment : BaseFragment( } } - fun writeComment(boardNo: String) { - val comment = bindingNonNull.edittextComment.text.toString() - if (comment == "") { - showToast(getString(R.string.board_write_textview_content_hint)) - return - } - if (selectedCommentId != null) { - viewModel.writeReply(ReplyDto(boardNo, selectedCommentId!!, comment)) - deselectComment() - } else { - viewModel.writeComment(CommentDto(boardNo, comment)) - } + private fun initCreateCommentButton() { + bindingNonNull.imgPostComment.setOnClickListener(object : DebouncingClickListener() { + override fun onDebouncedClick(v: View) { + if(boardItem.boardNo.isBlank()) return + val comment = bindingNonNull.edittextComment.text.toString() + if (comment == "") { + showToast(getString(R.string.board_write_textview_content_hint)) + return + } + if (selectedCommentId != null) { + viewModel.writeReply(ReplyDto(boardItem.boardNo, selectedCommentId!!, comment)) + deselectComment() + } else { + viewModel.writeComment(CommentDto(boardItem.boardNo, comment)) + } + } + }) } private fun initObserver() { @@ -167,7 +183,10 @@ class BoardDetailFragment : BaseFragment( showToast(it) if (it == getString(R.string.board_delete_notice_success)) { findNavController().navigate(R.id.action_boardDetailFragment_to_boardListFragment) - } else if(it == getString(R.string.comment_delete_notice_success) || it == getString(R.string.reply_delete_notice_success)) { + } else if (it == getString(R.string.comment_delete_notice_success) || it == getString( + R.string.reply_delete_notice_success + ) + ) { viewModel.boardDetail.value?.boardDetail?.let { viewModel.getBoardDetail(it.boardNo) } } } diff --git a/app/src/main/java/com/ssafy/gumi_life_project/ui/board/BoardWriteFragment.kt b/app/src/main/java/com/ssafy/gumi_life_project/ui/board/BoardWriteFragment.kt index 13e0fbd..5d5fae5 100644 --- a/app/src/main/java/com/ssafy/gumi_life_project/ui/board/BoardWriteFragment.kt +++ b/app/src/main/java/com/ssafy/gumi_life_project/ui/board/BoardWriteFragment.kt @@ -1,6 +1,7 @@ package com.ssafy.gumi_life_project.ui.board import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController @@ -8,6 +9,7 @@ import com.ssafy.gumi_life_project.R import com.ssafy.gumi_life_project.data.model.BoardWriteItem import com.ssafy.gumi_life_project.data.model.BoardWriteResponseType import com.ssafy.gumi_life_project.databinding.FragmentBoardWriteBinding +import com.ssafy.gumi_life_project.util.DebouncingClickListener import com.ssafy.gumi_life_project.util.template.BaseFragment import dagger.hilt.android.AndroidEntryPoint @@ -41,15 +43,19 @@ class BoardWriteFragment : BaseFragment( } private fun initListener() { - bindingNonNull.buttonWrite.setOnClickListener { - val title = bindingNonNull.edittextTitle.text.toString() - val content = bindingNonNull.edittextContent.text.toString() - if (title != "" && content != "") { - viewModel.writeBoard(BoardWriteItem(title, content)) - } else { - showToast(getString(R.string.board_write_toast_message)) + bindingNonNull.buttonWrite.setOnClickListener( + object : DebouncingClickListener() { + override fun onDebouncedClick(v: View) { + val title = bindingNonNull.edittextTitle.text.toString() + val content = bindingNonNull.edittextContent.text.toString() + if (title != "" && content != "") { + viewModel.writeBoard(BoardWriteItem(title, content)) + } else { + showToast(getString(R.string.board_write_toast_message)) + } + } } - } + ) } private fun initObserver() { diff --git a/app/src/main/java/com/ssafy/gumi_life_project/util/DebouncingClickListener.kt b/app/src/main/java/com/ssafy/gumi_life_project/util/DebouncingClickListener.kt new file mode 100644 index 0000000..d354723 --- /dev/null +++ b/app/src/main/java/com/ssafy/gumi_life_project/util/DebouncingClickListener.kt @@ -0,0 +1,20 @@ +package com.ssafy.gumi_life_project.util + +import android.view.View + +abstract class DebouncingClickListener(private val delayMillis: Long = 1000L) : View.OnClickListener { + + private var lastClickTimes = mutableMapOf() + + final override fun onClick(v: View) { + val currentTime = System.currentTimeMillis() + val lastClickTime = lastClickTimes[v] ?: 0L + + if (currentTime - lastClickTime > delayMillis) { + lastClickTimes[v] = currentTime + onDebouncedClick(v) + } + } + + abstract fun onDebouncedClick(v: View) +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_board_detail.xml b/app/src/main/res/layout/fragment_board_detail.xml index 40fd70f..ce4f7a2 100644 --- a/app/src/main/res/layout/fragment_board_detail.xml +++ b/app/src/main/res/layout/fragment_board_detail.xml @@ -222,7 +222,6 @@ android:layout_height="40dp" android:layout_gravity="center" android:layout_marginEnd="8dp" - android:onClick="@{() -> boardDetail.writeComment(viewModel.boardDetail.boardDetail.boardNo)}" android:padding="5dp" app:srcCompat="@drawable/icon_write_comment" app:tint="@color/main_color" />