2024.01.18(목) TIL

quinones·2024년 1월 18일

RecyclerView 검색

리사이클러뷰에서 검색을 할 수 있는 기능을 추가해보았다.

  1. xml에 추가
<SearchView
        android:id="@+id/search_view_phone_book"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:iconifiedByDefault="false"
        app:layout_constraintEnd_toEndOf="@+id/toolbar"
        app:layout_constraintStart_toStartOf="@+id/toolbar"
        app:layout_constraintTop_toBottomOf="@+id/toolbar" />
  1. 프래그먼트에서 변수 선언
private lateinit var searchView: SearchView
private lateinit var originalDataList: MutableList<MyItem>
  1. 프래그먼트의 onCreateView안에서 기존데이터를 저장해준다.
override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    binding = FragmentContactsBinding.inflate(inflater, container, false)
    initPermission()

//여기 부분이 추가된부분
    originalDataList = ArrayList(dataList)
    searchView = binding.searchViewPhoneBook
    searchView.setOnQueryTextListener(searchViewTextListener)

    return binding.root
}
  1. 그다음에 아래 내용을 추가해준다.
var searchViewTextListener: SearchView.OnQueryTextListener =
        object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String): Boolean {
                // 검색 버튼을 눌렀을 때의 동작
                return false
            }

            override fun onQueryTextChange(newText: String): Boolean {
                // 텍스트가 변경될 때마다 호출되는 메서드
                filterData(newText)
                return true
            }
        }
    private fun filterData(query: String) {
        // 검색어에 따라 데이터를 필터링하여 새로운 리스트 생성
        val filteredList = originalDataList.filter { item ->
            item.name.contains(query, ignoreCase = true)
        }.toMutableList()

        // 어댑터에 필터링된 데이터 설정
        adapter.setData(filteredList)
    }
  1. 마지막으로 리사이클러뷰 사용한 어뎁터에 함수 추가
    fun setData(newItem: List<MyItem>){
        mItems.clear()
        mItems.addAll(newItem)
        notifyDataSetChanged()
    }

이렇게하면 프래그먼트 안에서 리사이클러뷰 검색기능을 추가해 줄 수 있다.

플로팅버튼 없애기

리사이클러뷰안에서 데이터의 오른쪽에 별표 이미지를 넣고, 즐겨찾기 기능을 추가했다. 근데 항상 떠다니는 플로팅버튼때문에 제일 아래에있는 데이터는 좋아요를 누르기가 힘들었다.
그래서 스크롤을 2초동안 하지 않았을때 플로팅버튼을 없애버리기로 했다.

플로팅버튼을 프래그먼트에서 사용중이다. 이때 사용하려면 onViewCreated안에서

//플로팅버튼 스크롤 안할시 사라지게
val scrollHandler = Handler()
val delayMillis = 2000L // 2초
var isScrolling = false
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
    override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
        super.onScrollStateChanged(recyclerView, newState)
        isScrolling = newState != RecyclerView.SCROLL_STATE_IDLE
        if (!isScrolling) {
            scrollHandler.postDelayed({
                if (!isScrolling) {
                    floatingBtn.hide()
                }
            }, delayMillis)
        } else {
            floatingBtn.show()
        }
    }

이렇게 사용해주면 2초동안 스크롤이 사용되지않았을때 플로팅버튼이 안보이게 된다.

상단 툴바 프래그먼트에서 사용하기

앱의 오른쪽 상단에 ... 이 보인다. 이 버튼을 누르면 내가 원하는 기능을 넣을 수 있다.
툴바를 사용하는법은

  1. xml에서 toolbar를 만들어준다.
<androidx.appcompat.widget.Toolbar
	android:id="@+id/toolbar"
	android:layout_width="match_parent"
	android:layout_height="?attr/actionBarSize"
	android:background="?attr/colorPrimary"
	app:layout_constraintTop_toTopOf="parent"
	app:layout_constraintStart_toStartOf="parent"
	app:layout_constraintEnd_toEndOf="parent"/>
  1. 액티비티/프래그먼트 안에서 이렇게 사용해준다. 여기서는 listView/GridView로 데이터를 화면에 띄워주었다.
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.menu_contacts, menu)
    super.onCreateOptionsMenu(menu, inflater)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.action_list_view -> {
            // 메뉴 아이템이 클릭되었을 때의 동작을 여기에 작성합니다.
            binding.recyclerView.layoutManager = LinearLayoutManager(requireContext())
            adapter.setGridView(false)
            binding.recyclerView.adapter = adapter
            true
        }

        R.id.action_grid_view -> {
            // 메뉴 아이템이 클릭되었을 때의 동작을 여기에 작성합니다.
            binding.recyclerView.layoutManager = GridLayoutManager(requireContext(), 4)
            adapter.setGridView(true)
            binding.recyclerView.adapter = adapter
            true
        }

        else -> super.onOptionsItemSelected(item)
    }
}
  1. ★ 중요 ★
(activity as AppCompatActivity).setSupportActionBar(binding.toolbar)

나는 프래그먼트에서 사용했는데, 이걸 onCreate()가 아닌!
onViewCreated()에서 선언해주어야 한다.
ToolBar는 onCreat()에서 선언할수 없다. 이거때매 시간 잡아먹었어요 ㅜ

profile
이우진

0개의 댓글