개요
이 튜토리얼에서는 Java의 Collections 클래스를 활용하여 안드로이드에서 ListView의 데이터를 정렬하는 방법을 단계별로 살펴봅니다. 사용자가 입력한 이름을 HashSet에 저장한 후 ArrayList로 변환하고, Collections.sort() 메서드를 통해 오름차순으로 정렬하여 ListView에 표시하는 예제입니다.
1단계 – 새 프로젝트 생성
Android Studio에서 새 프로젝트를 만듭니다. 상단 메뉴에서 File ⇒ New Project를 선택하고, 프로젝트 생성에 필요한 모든 정보를 입력합니다.
2단계 – 레이아웃 작성 (res/layout/activity_main.xml)
res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.
<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "https://schemas.android.com/apk/res/android"
xmlns:tools = "https://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = ".MainActivity"
android:orientation = "vertical">
<EditText
android:id = "@+id/name"
android:layout_width = "match_parent"
android:hint = "Enter Name"
android:layout_height = "wrap_content" />
<LinearLayout
android:layout_width = "wrap_content"
android:layout_height = "wrap_content">
<Button
android:id = "@+id/save"
android:text = "Save"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content" />
<Button
android:id = "@+id/refresh"
android:text = "Refresh"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content" />
</LinearLayout>
<ListView
android:id = "@+id/listView"
android:layout_width = "match_parent"
android:layout_height = "wrap_content">
</ListView>
</LinearLayout>위 레이아웃에는 이름을 입력받는 EditText, 데이터를 저장하는 'Save' 버튼, ListView의 변경 사항을 갱신하는 'Refresh' 버튼, 그리고 결과를 표시할 ListView가 배치되어 있습니다. 사용자가 Save 버튼을 클릭하면 입력한 데이터가 ArrayList에 저장되며, Refresh 버튼을 누르면 ListView에 변경 내용이 즉시 반영됩니다.
3단계 – MainActivity 작성 (src/MainActivity.java)
src/MainActivity.java 파일에 아래 코드를 추가합니다.
package com.example.andy.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.Vector;
public class MainActivity extends AppCompatActivity {
EditText name;
ArrayAdapter arrayAdapter;
ArrayList<String> array_list;
Set set = new HashSet();
private ListView listView;
@Override
protected void onCreate(Bundle readdInstanceState) {
super.onCreate(readdInstanceState);
setContentView(R.layout.activity_main);
array_list = new ArrayList<String>();
name = findViewById(R.id.name);
listView = findViewById(R.id.listView);
findViewById(R.id.refresh).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
arrayAdapter.notifyDataSetChanged();
listView.invalidateViews();
listView.refreshDrawableState();
}
});
findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!name.getText().toString().isEmpty()) {
set.add(name.getText().toString());
array_list.clear();
array_list.addAll(set);
Collections.sort(array_list);
arrayAdapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, array_list);
listView.setAdapter(arrayAdapter);
Toast.makeText(MainActivity.this, "Inserted", Toast.LENGTH_LONG).show();
} else {
name.setError("Enter NAME");
}
}
});
}
}핵심 로직은 Save 버튼의 클릭 리스너에 있습니다. 입력값이 비어 있지 않으면 해당 이름을 HashSet에 추가하여 중복을 제거하고, 이를 ArrayList로 옮긴 뒤 Collections.sort(array_list)를 호출해 오름차순으로 정렬합니다. 이후 어댑터를 새로 생성하여 ListView에 연결함으로써 항상 정렬된 상태의 목록이 화면에 표시됩니다.
4단계 – 앱 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 Run 아이콘을 클릭하고, 기기 선택 목록에서 본인의 모바일 기기를 고르면 됩니다. 그러면 기기 화면에 아래와 같은 기본 화면이 나타납니다.

위 실행 결과에서 확인할 수 있듯이, Set에 저장된 이름 요소들이 정렬된 순서대로 어댑터에 전달되어 ListView에 깔끔하게 표시됩니다. 이처럼 Collections 클래스를 활용하면 복잡한 정렬 알고리즘을 직접 구현하지 않고도 한 줄의 코드로 ListView 데이터를 손쉽게 정렬할 수 있습니다.