Yeon DevLog

Android Studio/Front

[Android Studio][안드로이드스튜디오] RecyclerView &Filterable & TabLayout

devYeON_ 2022. 1. 20. 22:45

📙 주제

RecyclerView를 이용하면서 들어간 리스트들을 원하는 입맛에 맞게 TabLayout을 이용해 Filtering을 하고 싶은 상황이 생긴다. 이때, RecyclerView에 Filterable을 상속받아 사용하면 빠르게 해결할 수 있다.

📙 순서

더보기

전제조건 : RecyclerView를 다 연결했다.

1.  RecyclerView에 Filterable을 연결한다 (Adapter)

class AreaFilterAdapter (item:ArrayList<Place>) : RecyclerView.Adapter<AreaFilterAdapter.AreaViewHolder>(),
    Filterable {
    private var unFilteredList = item
    private var filteredList = item
    private var context:Context?=null
    var list = mutableListOf<Place>()

    override fun getFilter(): Filter {
        return object  : Filter(){
            override fun performFiltering(constraint: CharSequence?): FilterResults {
                //event
                val charString = constraint.toString()
                Log.d(TAG, "performFiltering: ${charString}")
                filteredList = if(charString.isEmpty()){
                    unFilteredList
                }else{
                    val filteringList = ArrayList<Place>()
                    for(item in unFilteredList!!){
//                        Log.d(TAG, "performFiltering: ${item}")
                        if(item!!.info.contains(charString)) filteringList.add(item)
                    }
                    filteringList
                }
                val filterResults = FilterResults()
                filterResults.values = filteredList
                Log.d(TAG, "performFiltering: ${filterResults.values}")
                return filterResults
            }

            override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
                filteredList = results?.values as ArrayList<Place>
                notifyDataSetChanged()
            }

        }
    }

}

이렇게 넘어온 CharString이라는 매개변수로 내가 정해놓은 정보와 일치하는지 확인하여 필터링을 하는 과정이다

2. TabLayout을 연결한다(Activity or Fragment)

 fun initTab(){
        initAdapter()
        binding.areaTabLayout.addTab(binding.areaTabLayout.newTab().setText("쇼핑"))
        binding.areaTabLayout.addTab(binding.areaTabLayout.newTab().setText("카페"))
        binding.areaTabLayout.addTab(binding.areaTabLayout.newTab().setText("맛집"))

        binding.areaTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener{
            override fun onTabSelected(tab: TabLayout.Tab?) {
                when(tab?.position){
                    0 ->{
                        areaFilterAdapter.filter.filter("")
                    }
                    1->{
                        areaFilterAdapter.filter.filter("관광명소")
                    }
                    2->{
                        areaFilterAdapter.filter.filter("테마/체험")
                    }
                    3->{
                        areaFilterAdapter.filter.filter("쇼핑")
                    }
                    4->{
                        areaFilterAdapter.filter.filter("맛집")
                    }
                    5->{
                        areaFilterAdapter.filter.filter("카페")
                    }
                }
            }

            override fun onTabUnselected(tab: TabLayout.Tab?) {
                //
            }

            override fun onTabReselected(tab: TabLayout.Tab?) {
            }
        })
    }

filter 될 charString을 tablayout의 item으로 지정해주면 바로 필터링된 TabLayout + RecyclerView를 볼 수 있다.

🔎🔎 꿀팁

override fun onBindViewHolder(holder: AreaViewHolder, position: Int) {
        holder.apply {
            bindInfo(filteredList[position])
            itemView.setOnClickListener {
                itemClickListener.onClick(it,position,list[position].name)
            }
        }
    }

Adapter의 onBindViewHolder에 리스트를 연결할 때는 필터링된 리스트를 넣어줘야지 원하는 정보를 볼 수 있습니다!

 


간단하게 안드로이드 스튜디오의 필터링 방법에 대해 소개해봤습니다!!

'Android Studio > Front' 카테고리의 다른 글

[Android Studio][Kotlin] 캘린더 Custom UI  (0) 2022.04.01
[Android Studio][Kotlin] Custom Popup Menu  (0) 2022.01.25