프로젝트

[안드로이드 스튜디오] 커스텀 리스트뷰 검색기능

gom1n 2021. 8. 24. 16:35

커스텀 리스트뷰 검색기능은 정말.. 많은 시도를 해보았는데,

noFilter ? 클래스를 상속하기보단 editText 내용을 검색하는 search함수를 짜주는 것이 훨씬 편했다.

따라서 searchView 가 아닌, editText를 사용한다.

다만 DB를 탐색하는 것이 아닌 액티비티 내에서만 검색이 가능하다.

 

우선 기존의 마켓아이템리스트와 그냥리스트를 선언해줍니다.

ArrayList<MarketItem> marketItemArrayList;
ArrayList<MarketItem> arraylist;

 

마켓아이템리스트는 처음에 액티비티가 실행되었을 때에 보이는 마켓의 아이템들이고,

그냥리스트는 추후에 검색할 때마다 추가되어 출력되는 형식이기 때문에,

이렇게 두 개의 리스트를 선언해줍니다.

-> 한글자씩 써줄 때마다 마켓리스트는 clear, 글자에 따른 그냥리스트가 출력.

 

OnCreate 안에 다음과 같이 editText 함수들을 써줍니다.

editText 의 내용이 달라질 때마다 호출되는 함수들을 Override 해줍니다.

arraylist.addAll(marketItemArrayList);
        // 검색기능 (앱 내)
        EditText searchView = (EditText) viewGroup.findViewById(R.id.searchView);
        searchView.addTextChangedListener(new TextWatcher(){
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2){

            }
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2){

            }
            @Override
            public void afterTextChanged(Editable editable){
                String text = searchView.getText().toString();
                search(text);
            }
        });

 

OnCreate 바깥에 search함수를 짜줍니다.

public void search(String charText){

        marketItemArrayList.clear();

        if(charText.length() == 0){
            marketItemArrayList.clear();
            marketItemArrayList.addAll(arraylist);
        }
        else{
            for(int i = 0; i < arraylist.size(); i++){
                if(arraylist.get(i).getName().toLowerCase().contains(charText)){
                    marketItemArrayList.add(arraylist.get(i));
                }
            }
        }
        adapter.notifyDataSetChanged();
    }

글자가 하나씩 바뀔 때마다 추가가 됩니다.