Filterable로 자동검색 만들기

2020. 8. 17. 19:51android

자동완성을 만들기위해서 전반적인 구조

1. 사용자가 검색할 수 있는 장치 -> EditText

2. 사용자가 입력할 때마다 String 값을 넘겨주는 이벤트 -> TextWatcher

3. 매 순간 넘어오는 String 값이 포함된 리스트 -> recyclerView

4. 필터링 기능 -> Filterable 

 

위의 구조를 통해서 자동완성 기능을 순서대로 만들어 보겠습니다. 

 

 

1. 검색을 위한 EditText 및 RecyclerView 생성


사용자가 검색할 수 있는 EditText와 검색된 내용을 포함하고 있는 자료들을 리스트로 보여주기위해서 xml에 EditText와 RecyclerView를 생성합니다.

 

2. TextWatcher


사용자가 입력한 검색어를 실시간으로 계속 얻기 위해서는 TextWatcher 인터페이스를 overriding 해야합니다. 

overriding 해야하는 메서드는 모두 3개이고 그 중에서 onTextChanged() 메서드만 사용할 것입니다.(하나만 사용한다해서 다른 것들을 지우면 에러납니다!! 모두 overriding 해주세요)

 

그리고서 editText의 addTextChangedListener를 통해서 TextWatcher 리스너를 달아줍니다.  여기까지하면 editText에서 입력한 내용을 인자값인 s를 통해서 지속적으로 받을 수 있습니다. 이 인자값 s은 사용자가 입력하는 실시간 String 값이기 때문에 이를 이용해서 Filtering을 진행 할 것입니다. 

 

이후 recyclerView를 사용하기 위한 기본적인 처리(setLayoutManager,setHasFixedSize 등)를 해줍니다.

(참고로 아직 리사이클러뷰에 들어갈 어댑터를 만들지 않았기 때문에 setAdapter는 에러가 납니다! 아무것도 없는데 set하니까요!)

 

3. recyclerView_ element.xml 생성 


리사이클러뷰의 내부 요소에 들어갈 모양을 만들어 주기 위해서 item.xml을 별도로 생성해 줍니다.

여기서는 단순히 String 값만 보여줄꺼니까 TextView하나만 갖는 item.xml을 만들겠습니다. 

(참고로 RecyclerView의 요소로 들어가야하는 ViewGroup은 LinearLayout이어야 합니다. 때문에 최상단의 ViewGroup은 LinearLayout으로 해야하는 것을 잊지마세요!)

 

4. RecyclerView Adapter생성 


사전 작업이 모두 끝났으니 이제 사용자가 입력한 값을 받아서 필터링 처리를 해주면 끝이납니다. 

어댑터의 생성자를 통해서 context와 리스트를 받아옵니다.

 

context는 recyclerView에 들어갈 item을 inflate하기 위해서 필요하고, 리스트는 mainActivity에서 생성한 리스트를 받기위해서 선언했습니다.

 

생성자에서 받은 리스트는 정렬되지 않은 리스트 이기 때문에 필터링 된 값들을 저장할 리스트를 어댑터 내부에서 별도로 생성해줍니다. 이후 필터링 기능을 만들기 위해서 Filterable 인터페이스를 overriding합니다.

overriding 된 메서드 들 중 performFiltering 메서드에서 필터링이 수행되어지고 publishResults 메서드를 통해서

UI를 갱신시켜주는 작업을 처리합니다.

  

 

5. 결과 

'android' 카테고리의 다른 글

Retrofit2 사용해보기  (12) 2020.08.19
DataBinding 사용해보기  (2) 2020.08.17
TabLayout과 viewPager2 연결하기  (0) 2020.08.12
ViewPager2 어댑터 사용 방법  (0) 2020.08.12
newInstance()로 Fragment 생성해야하는 이유  (0) 2020.08.12