[Android] ViewPager2에서 아이템 선택 시 flickering 현상 해결

hegleB·2023년 6월 30일
0
post-thumbnail

문제

지역 아이템을 선택할 때 마다 flickering 현상이 발생된다.

원인

아이템을 클릭 할 때 마다 notifyItemChanged(index)을 통해 아이템이 갱신되어 깜박이는 현상이 발생하였다.

오류 발생 코드

// LocationSettingFragment
 private fun initAdapter() {
        adapter.setItemClickListener(object : LocationRegionAdapter.ItemClickListener {
            override fun onClick(position: Int) {
                listener.setRegionPosition(position)
            }
        })
    }
    
private fun getFragments(): MutableList<Fragment> {
        return mutableListOf(
            LocationSettingFragment.newInstance(
                title = getString(R.string.selection_do),
                subTitle = getString(R.string.do_name),
                regionArray = Region.getArray(this),
                listener = listener
            ),
            LocationSettingFragment.newInstance(
                title = getString(R.string.selection_city),
                subTitle = getString(R.string.city_name),
                regionArray = Region.getArray(this),
                listener = listener
            ),
            LocationSettingFragment.newInstance(
                title = getString(R.string.selection_map),
                subTitle = getString(R.string.map),
                regionArray = emptyArray(),
                listener = listener
            )
        )
    }
    
// LocationSettingPagerAdapter
fun refreshFragment(index: Int, fragment: Fragment) {
	fragments[index] = fragment	
    notifyItemChanged(index)
}

// LocationSettingActivity
    override fun setRegionPosition(postion: Int) {
        adapter.refreshFragment(
            1,
            LocationSettingFragment.newInstance(
                title = getString(R.string.selection_city),
                subTitle = getString(R.string.city_name),
                regionArray = Region.getArray(this, postion),
                listener = listener
            )
        )
    }

ViewPager2의 위치에 따라 재사용되는 프래그먼트에서 클릭할 때마다 아이템이 변경되고 flickering 현상이 발생하게 되었다.

해결방법

    private fun setSelectedRegionName(postion: Int) {
        val regionArray = Region.getArray(this@LocationSettingActivity, postion)
        when (currentItemPosition) {
            0 -> {
                selectedRegionId = postion
                selectedRegionName[0] = getStringArrayCompat(R.array.array_region)[postion]
                selectedRegionName[1] = String.Empty
                refreshAdapter(regionArray)
            }
            1 -> {
                selectedRegionName[1] =
                    Region.getArray(this@LocationSettingActivity, selectedRegionId)[postion]
                refreshAdapter(regionArray)
            }
        }
    }

ViewPager2 위치에 따라 선택된 지역 이름들을 설정하여 선택할 때마다 해당 지역에 대한 데이터를 갱신되지 않도록 하였다.

profile
성장하는 개발자

0개의 댓글

관련 채용 정보