이 튜토리얼에서는 Android 앱에서 우선순위 큐(PriorityQueue)의 데이터를 ArrayList에 추가한 뒤, 이를 ListView에 표시하는 방법을 단계별로 알아봅니다.
PriorityQueue는 요소들을 자동으로 정렬된 순서(기본적으로 오름차순)로 관리하는 자료구조입니다. 사용자가 입력한 데이터를 PriorityQueue에 넣었다가 다시 ArrayList로 옮기면, 정렬된 상태의 목록을 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단계: 메인 액티비티 작성 (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.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.PriorityQueue;
public class MainActivity extends AppCompatActivity {
Button save, refresh;
EditText name;
ArrayAdapter arrayAdapter;
PriorityQueue<String> hs;
ArrayList<String> array_list;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
array_list = new ArrayList<>();
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()) {
array_list.add(name.getText().toString());
PriorityQueue<String> hs = new PriorityQueue<String>();
hs.addAll(array_list);
array_list.clear();
array_list.addAll(hs);
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 버튼 클릭 시 동작하는 핵심 코드는 다음과 같습니다.
- 입력 필드가 비어 있지 않은지 먼저 확인하고, 비어 있다면 에러 메시지를 표시합니다.
- 입력된 이름을 ArrayList에 추가합니다.
- ArrayList의 모든 요소를 PriorityQueue에 담으면(
hs.addAll(array_list)) 요소들이 자동으로 오름차순으로 정렬됩니다. - 기존 ArrayList를 비운 뒤(
array_list.clear()), 정렬된 PriorityQueue의 요소를 다시 ArrayList에 옮깁니다(array_list.addAll(hs)). - 갱신된 ArrayList로 ArrayAdapter를 생성하여 ListView에 설정하고, 성공 메시지를 Toast로 표시합니다.
이 과정을 통해 PriorityQueue의 정렬 기능을 활용해 ArrayList의 데이터를 항상 정렬된 상태로 유지할 수 있습니다.
앱 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. 실제 Android 모바일 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run 아이콘을 클릭하세요. 실행할 모바일 기기를 선택하면 해당 기기에 앱이 설치되어 기본 화면이 표시됩니다.

위 실행 결과에서 볼 수 있듯이, 사용자가 입력한 이름 데이터가 PriorityQueue를 거쳐 정렬된 순서대로 ArrayList에 삽입되고, 그 결과가 ListView에 표시됩니다.