마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

recyclerView item longClick 시에 gone 상태의 checkBox 보이게 하기

0 추천

롱클릭

두가지 문제가 있습니다.

첫번째는 gone상태에서 롱클릭을 할시에 애니메이션 효과가 나오지 않습니다. 그후 visible 상태에서 다시 롱클릭을 하면 animation이 나옵니다.

두번째로는 animation 효과가 모든 item에서 보이지 않습니다.

 

일단 animation 구현 코드와 롱클릭시 checkbox visible에관한 코드는 아래와 같습니다

 

class ItemMemoListViewHolder(itemView: View?): RecyclerView.ViewHolder(itemView!!) {

    val title = itemView?.findViewById<TextView>(R.id.memo_list_item_title)
    val date = itemView?.findViewById<TextView>(R.id.memo_list_item_date)
    val contents = itemView?.findViewById<TextView>(R.id.memo_list_item_contents)
    val check = itemView?.findViewById<CheckBox>(R.id.memo_list_item_check)

    fun bind(memo: Memo) {
        title?.text = memo.title
        date?.text = memo.currentDate
        contents?.text = memo.contents
        if(memo.isVisibility){
            val anim = TranslateAnimation(-check!!.width.toFloat(),0f,0f,0f)
            anim.duration = 400
            anim.fillAfter = true
            title!!.animation = anim
            date!!.animation = anim
            check!!.animation = anim
            check!!.visibility = View.VISIBLE
        }
        else{
            check?.visibility = View.GONE
        }
    }
}

 

 holder.itemView.setOnLongClickListener(object : View.OnLongClickListener{
            override fun onLongClick(v: View?): Boolean {
                for(index in 0..data.size-1){
                    data[index].isVisibility = true
                }
                notifyDataSetChanged()
                return true
            }
        })

memo 라는 데이터클래스 안에 isVisiblity라는 boolean 타입의 변수로 checkbox를 제어하는 방법으로 구현했습니다.

만약 해결 방법이 있다면 조언부탁바랍니다!!

혹은 animation 구현방법 자체가 비효율적이거나 잘못됐다면 구현 방향이라도 조언해주시면 감사하겠습니다!

따깡 (420 포인트) 님이 2021년 10월 21일 질문

1개의 답변

+1 추천
 
채택된 답변

제가 애니메이션에는 익숙하지 않아서 원하시는 답변을 어려울 것 같긴한데, 한가지만 말씀드리자면,

ViewHolder에서 애니메이션을 개별적인 뷰에 다 설정하지 말고 ItemView만 설정하는게 더 적합해 보입니다. 애니메이션이 똑같은 오브젝이므로,  소스코드를 봐야 정확하게 알겠지만, 변수를 통해 상태관리를 하고 있다면, 서로 간에 값을 공유하면서 문제가 생길 가능성이 있다고 보이구요. 그리고 코드를 통해서 400ms의 딜레이를 준 것이 이상한 효과를 만들더라구요.

아래 처럼 간단하게 테스트르 해봤는데요.

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    >
    <translate
        android:fromXDelta="-10%"
        android:toYDelta="0%"
        android:duration="200" />
</set>

fun bind(memo: Memo) {
            ...
            checkbox.isVisible = memo.isVisibility
            if (memo.isVisibility)  {
               itemView.animation = translationAnimation();
           }
 }

private fun translationAnimation() =  AnimationUtils.loadAnimation(itemView.context, R.anim.translate);

 

저도 애니메이션이 익숙치 않아서, 자세한 부분은 개발자 문서 등을 참조하셔야할 것 같아요.

spark (227,530 포인트) 님이 2021년 10월 22일 답변
따깡님이 2021년 10월 22일 채택됨
...