Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

안드로이드에서 TreeMap 데이터를 ArrayList에 담아 ListView로 표시하는 방법

이 예제는 안드로이드에서 TreeMap에 저장된 데이터를 ArrayList로 옮겨 ListView에 표시하는 방법을 다룹니다. TreeMap은 키를 기준으로 자동 정렬되기 때문에, 데이터를 정렬된 상태로 리스트뷰에 보여주고 싶을 때 유용하게 활용할 수 있습니다.

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/record"
        android:layout_width="match_parent"
        android:hint="record number"
        android:inputType="number"
        android:layout_height="wrap_content" />
    <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 버튼과 Refresh 버튼, 그리고 ListView가 포함되어 있습니다. 사용자가 이름과 레코드 번호를 입력한 후 Save 버튼을 누르면 해당 데이터가 TreeMap에 저장되고, 이후 TreeMap의 값들이 ArrayList로 옮겨져 리스트뷰에 표시됩니다. Refresh 버튼을 누르면 리스트뷰의 변경 사항을 갱신할 수 있습니다.

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.Map;
import java.util.TreeMap;

public class MainActivity extends AppCompatActivity {
    Button save, refresh;
    EditText name, record;
    ArrayAdapter arrayAdapter;
    ArrayList<String> array_list;
    Map map = new TreeMap();
    private ListView listView;

    @Override
    protected void onCreate(Bundle readdInstanceState) {
        super.onCreate(readdInstanceState);
        setContentView(R.layout.activity_main);
        array_list = new ArrayList<>();
        name = findViewById(R.id.name);
        record = findViewById(R.id.record);
        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() && !record.getText().toString().isEmpty()) {
                    map.put(record.getText().toString(), name.getText().toString());
                    array_list.clear();
                    array_list.addAll(map.values());
                    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");
                    record.setError("Enter Record");
                }
            }
        });
    }
}

코드 동작 원리

Save 버튼 클릭 시 동작 흐름은 다음과 같습니다.

1. 입력값 검증: 이름과 레코드 번호 필드가 비어 있는지 확인합니다. 비어 있다면 각 EditText에 에러 메시지를 표시합니다.

2. TreeMap에 데이터 저장: map.put(record, name)을 호출하여 레코드 번호를 키(key), 이름을 값(value)으로 저장합니다. TreeMap이므로 키를 기준으로 오름차순 정렬이 자동으로 유지됩니다.

3. TreeMap → ArrayList 변환: array_list.clear()로 기존 목록을 비운 뒤, array_list.addAll(map.values())로 TreeMap의 모든 값을 ArrayList에 추가합니다. 이 과정 덕분에 ArrayList는 항상 정렬된 최신 데이터를 유지합니다.

4. 어댑터 설정 및 화면 갱신: ArrayAdapter를 새로 생성하여 ListView에 연결하고, "Inserted"라는 토스트 메시지를 통해 저장 완료를 알려줍니다.

Refresh 버튼을 누르면 notifyDataSetChanged(), invalidateViews(), refreshDrawableState()를 차례로 호출하여 리스트뷰를 강제로 다시 그립니다.

앱 실행 및 결과 확인

애플리케이션을 실행해 보겠습니다. 실제 안드로이드 스마트폰을 컴퓨터에 연결한 상태라고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 열고 툴바의 Run 아이콘을 클릭한 뒤, 실행 옵션에서 본인의 모바일 기기를 선택하세요. 이후 모바일 기기에서 앱의 기본 화면을 확인할 수 있습니다.

안드로이드에서 TreeMap 데이터를 ArrayList에 담아 ListView로 표시하는 방법

위 결과에서 확인할 수 있듯이, 사용자가 입력한 이름 데이터가 TreeMap을 거쳐 ArrayList로 전달되고, 정렬된 형태로 리스트뷰에 표시됩니다. 이처럼 TreeMap과 ArrayList를 조합하면 키 기준 정렬이 필요한 목록 화면을 손쉽게 구현할 수 있습니다.