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에 입력한 텍스트에 따라 목록이 필터링 되는 것을 확인할 수 있습니다.
'안드로이드 자바' 카테고리의 다른 글
[JAVA][Android] QuickContactBadge를 사용해서 주소록 연락처 정보가져오기 (0) | 2024.09.10 |
---|---|
[JAVA][Android] TabHost를 사용하여 탭 화면 만들기 (2) | 2024.09.08 |
[JAVA][Android] 안드로이드에서 URI를 전송 가능한 데이터 형태로 변환하기 (0) | 2024.09.06 |
[JAVA][Android] 이미지뷰 원으로 만들기 / 프로필 사진처럼 만들기 (2) | 2024.09.02 |
[JAVA][Android] 액티비티 재사용 시 onNewIntent로 인텐트 업데이트 (2) | 2024.08.31 |