📙 주제
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 |