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

Android ListView에서 Collections.rotate() 메서드로 요소 순서 회전하기

이 튜토리얼에서는 Android 앱에서 Collections.rotate() 메서드를 활용해 ListView의 항목 순서를 회전시키는 방법을 단계별로 알아봅니다.

1단계: 새 프로젝트 생성

Android Studio를 열고 File → New Project 메뉴로 이동한 후, 프로젝트 생성에 필요한 모든 정보를 입력하여 새 프로젝트를 만듭니다.

2단계: 레이아웃 파일 작성

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), 새로고침(Refresh) 버튼, 그리고 데이터를 표시할 ListView가 포함되어 있습니다. 사용자가 저장 버튼을 누르면 입력한 데이터가 ArrayList에 저장되고, 새로고침 버튼을 누르면 ListView의 변경된 내용을 확인할 수 있습니다.

3단계: MainActivity 코드 작성

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;
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>();
        array_list.ensureCapacity(20);
        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();
                    if (array_list.isEmpty()) {
                        array_list.addAll(set);
                        // 여기서 rotate() 메서드를 사용해
                        // 요소를 거리 2만큼 회전시킵니다.
                        Collections.rotate(array_list, 2);
                        array_list.trimToSize();
                        arrayAdapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, array_list);
                        listView.setAdapter(arrayAdapter);
                    } else {
                        listView.setVisibility(View.GONE);
                    }
                    Toast.makeText(MainActivity.this, "Inserted", Toast.LENGTH_LONG).show();
                } else {
                    name.setError("Enter NAME");
                }
            }
        });
    }
}

코드의 핵심은 Collections.rotate(array_list, 2) 부분입니다. HashSet으로 중복 입력을 방지한 뒤, 저장된 데이터를 ArrayList에 담고 rotate() 메서드를 호출하여 리스트의 요소들을 지정한 거리(여기서는 2)만큼 순환 이동시킵니다. 예를 들어 [A, B, C, D]라는 리스트를 거리 2로 회전하면 [C, D, A, B]가 됩니다.

앱 실행 및 결과 확인

실제 Android 기기를 컴퓨터에 연결한 상태에서 Android Studio의 툴바에 있는 Run 아이콘을 클릭해 앱을 실행합니다. 실행 옵션에서 연결된 모바일 기기를 선택하면, 기본 화면이 기기에 표시됩니다.

Android ListView에서 Collections.rotate() 메서드로 요소 순서 회전하기

위 실행 결과를 보면 이름을 입력해 저장할 때마다 데이터가 정상적으로 삽입되지만, 리스트의 각 항목이 2칸씩 밀린 순서로 배치되어 표시되는 것을 확인할 수 있습니다. 이처럼 Collections.rotate()를 활용하면 별도의 정렬 로직 없이도 ListView의 항목 순서를 손쉽게 조정할 수 있습니다.