리사이클러뷰에서 검색을 할 수 있는 기능을 추가해보았다.
<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" />
private lateinit var searchView: SearchView
private lateinit var originalDataList: MutableList<MyItem>
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
}
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)
}
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초동안 스크롤이 사용되지않았을때 플로팅버튼이 안보이게 된다.

앱의 오른쪽 상단에 ... 이 보인다. 이 버튼을 누르면 내가 원하는 기능을 넣을 수 있다.
툴바를 사용하는법은
<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"/>
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)
}
}
(activity as AppCompatActivity).setSupportActionBar(binding.toolbar)
나는 프래그먼트에서 사용했는데, 이걸 onCreate()가 아닌!
onViewCreated()에서 선언해주어야 한다.
ToolBar는 onCreat()에서 선언할수 없다. 이거때매 시간 잡아먹었어요 ㅜ