본문 바로가기
안드로이드 자바

[Java][Android]SearchView 사용 예시 만들기

by teamnova 2024. 9. 7.
728x90

오늘은 SearchView를 사용해 입력한 텍스트에 따라 RecyclerView 의 목록이 필터링 처리되는 예시를 만들어 보겠습니다.

 

SearchView는 사용자가 검색어를 입력하고 검색 요청을 할 수 있는 UI를 제공하는 위젯입니다.

 

 

레이아웃 xml 파일 코드(activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <androidx.appcompat.widget.SearchView
        android:id="@+id/searchView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

 

 

액티비티 클래스 코드

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //뷰의 id를 통해 SearchView 와 RecyclerView 객체 가져오기
        SearchView searchView = findViewById(R.id.searchView);
        RecyclerView recyclerView = findViewById(R.id.recyclerView);

        //RecyclerView에 표시할 항목 리스트 생성
        List<Item> itemList = new ArrayList<>();
        itemList.add(new Item("Apple"));
        itemList.add(new Item("Banana"));
        itemList.add(new Item("Orange"));
        itemList.add(new Item("Grapes"));
        itemList.add(new Item("Pineapple"));
        itemList.add(new Item("Mango"));

        //RecyclerView 관련 어댑터에 표시할 목록 및 레이아웃 매니저 설정
        ItemAdapter adapter = new ItemAdapter(itemList);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);

        //SearchView의 텍스트 변경시 반응할 리스너 설정
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                //SearchView에 검색버튼 누른 경우 처럼 제출 처리시 호출

                //SearchView의 기본동작이 동작하게하기 위해 false를 반환
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                //SearchView의 텍스트 변경시 호출
                //입력한 텍스트에 따른 필터링 처리
                adapter.filter(newText);

                //해당 이벤트에 대해 현재 리스너에 정의한 동작까지만 처리하고 기본 동작은 스킵하길 원함을 알리기 위해 true 반환
                return false;
            }
        });
    }
}

 

 

 

아이템 클래스  코드(리사이클러뷰 항목 데이터 관련)

public class Item {
    private String name;

    public Item(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

 

 

 

 

어댑터 클래스 코드

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> {
    private List<Item> itemList; // 현재 보여지는 아이템 목록
    private List<Item> itemListFull; // 모든 아이템 목록 (필터링 전 원본)


    // 생성자: 초기 아이템 목록을 받아와 설정
    public ItemAdapter(List<Item> itemList) {
        this.itemList = itemList;
        this.itemListFull = new ArrayList<>(itemList); // 원본 목록을 따로 저장
    }

    // 새로운 뷰 홀더 생성 관련 메서드
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // inflate() 메서드 호출을 통해 간단한 목록 아이템 뷰 생성
        View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
        return new ViewHolder(view);
    }

    // 뷰 홀더에 데이터를 바인딩 관련 메소드
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        // 현재 아이템의 이름을 뷰 홀더에 설정
        holder.setText(itemList.get(position).getName());
    }

    // 리사이클러뷰를 위한 아이템 개수 관련 메소드
    @Override
    public int getItemCount() {
        return itemList.size();
    }

    // SearchView에 입력한 텍스트에 따라 목록을 필터링하는 메소드
    public void filter(String text) {
        itemList.clear(); // 현재 목록을 비움
        if (text.isEmpty()) {
            // SearchView에 입력한 텍스트가 비어있으면 모든 아이템을 다시 추가
            itemList.addAll(itemListFull);
        } else {
            // SearchView에 입력한 텍스트를 소문자로 변환하여 대소문자 구분 없이 비교
            text = text.toLowerCase();
            for (Item item : itemListFull) {
                // 아이템 이름에 SearchView에 입력한 텍스트가 포함되어 있는지 확인
                if (item.getName().toLowerCase().contains(text)) {
                    itemList.add(item); // 포함된 아이템만 추가
                }
            }
        }
        notifyDataSetChanged(); // 보여줄 데이터가 변경되었음을 RecyclerView에 알림
    }


    //아이템 뷰를 재사용하기 위한 뷰홀더 클래스
    public static class ViewHolder extends RecyclerView.ViewHolder {
        TextView textView;// 아이템 이름을 표시하는 TextView

        public ViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(android.R.id.text1);
        }

        // 뷰홀더가 가진 TextView에 텍스트를 설정하는 메소드
        public void setText(String text){
            textView.setText(text);
        }
    }
}

 

 

 

 

 

실행 결과

 

 

SearchView에 입력한 텍스트에 따라 목록이 필터링 되는 것을 확인할 수 있습니다.