📱Application/Android

사용자 인터페이스02 - 어댑터뷰(Adapter View)

dlalwl_jpg 2022. 5. 27. 05:44

어댑터뷰란?

여러 개의 뷰를 일정한 형태로 표시하여 보여줄 수 있는 ViewGroup의 일종이다.

Adapter View의 사용 개념도

Adapter View는 View를 표시할 공간을 제공한다.

Adapter는 레이아웃과 데이터를 결합하여 Adapter View에 표시할 View를 생성하고 제공하는 클래스이다.

Adapter 객체는 배열 연결은 ArrayAdapter, DB연결은 CursorAdapter, XML 연결은 SimpleAdapter를 사용한다.

 

#실습 1

- 아래 그림과 같은 리스트 뷰를 갖는 앱 생성하기

- 초기 화면-


<MainActivity.java>

package ddwucom.moblie.week09.listviewtest2;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    DataManager dataManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        dataManager = new DataManager();
        ArrayList<String> subList = dataManager.getSubjectList();
		
        //어댑터 생성
        ArrayAdapter<String> adapter;
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, subList);
		
        //어댑터 뷰 준비 및 어댑터 연결
        ListView listView = (ListView) findViewById(R.id.listView);
        listView.setAdapter(adapter);
    }
}

 

1. ArrayAdapter

ArrayAdapter<String> adapter;

결합 대상 데이터 형태가 배열일 때 사용하는 객체이다.

앞서 말했지만 결합 대상이 DB일 때는 CursorAdapter, XML일 때는 SimpleAdapter를 사용한다. 

2. simple_list_item_1

adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, subList);

데이터를 표시할 레이아웃의 한 종류이다.

android.R.layout 은 안드로이드에서 기본으로 제공하는 레이아웃을 사용한다는 것이다.

(android.R.layout.자신이 사용할 레이아웃 종류) 이런 식으로 기본 레이아웃을 사용한다.

기본 레이아웃 종류


<DataManager.java>

- Activity와 별개로 List View에 표시할 데이터를 관리하는 별도의 클래스를 사용하기 위해 java 파일에 DataManager.java를 별도로 생성

package ddwucom.moblie.week09.listviewtest2;

import java.util.ArrayList;

public class DataManager {

    ArrayList<String> subjectList;

    public DataManager(){
        subjectList = new ArrayList<>();
        subjectList.add("노르웨이숲");
        subjectList.add("러시안블루");
        subjectList.add("코리안숏헤어");
        subjectList.add("먼치킨");
        subjectList.add("터키시앙고라");
        subjectList.add("페르시안");
        subjectList.add("스코티시폴드드");
    }

    public ArrayList<String> getSubjectList() {
        return subjectList;
    }
}

<activity_main.xml>

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="고양이 종류"
        android:textSize="25dp"
        android:textStyle="bold"
        app:layout_constraintBottom_toTopOf="@+id/listView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1.0" />

    <ListView
        android:id="@+id/listView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.095" />

</androidx.constraintlayout.widget.ConstraintLayout>

#실습 2

- EditText에 문자열 입력 후 [추가] 버튼을 눌러 항목 추가

- 항목을 클릭하면 EditText에 표시하고, 항목을 수정한 뒤 [수정] 버튼을 누르면 리스트 뷰 항복 변경

- 롱클릭 시 해당 항목 삭제

-초기 화면-

       -추가(시스템 소프트웨어)-                          -수정(네트워크)-                          -삭제(모바일소프트웨어)-                                                 

 

<activity_main.xml>

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/listView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginBottom="16dp"
        android:choiceMode="none"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <EditText
        android:id="@+id/etItem"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:ems="10"
        android:inputType="text"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btnUpdate"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:text="@string/update_btn"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/btnInsert"
        app:layout_constraintTop_toBottomOf="@+id/etItem" />

    <Button
        android:id="@+id/btnInsert"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:text="@string/insert_btn"
        app:layout_constraintEnd_toStartOf="@+id/btnUpdate"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/etItem" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="16dp"
        android:text="@string/del_msg"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btnInsert" />
</androidx.constraintlayout.widget.ConstraintLayout>

<SubjectManager.java>

package ddwucom.mobile.test08.adapterclicktest;

import java.util.ArrayList;

public class SubjectManager {
    private ArrayList<String> subjectList;

    public SubjectManager() {
        subjectList = new ArrayList();
        subjectList.add("모바일소프트웨어");
        subjectList.add("네트워크");
        subjectList.add("웹서비스");
        subjectList.add("운영체제");
        subjectList.add("웹프로그래밍2");
    }

    public ArrayList<String> getSubjectList() {
        return subjectList;
    }

//    추가를 수행하는 메소드
    public void addData(String newSubject) {
        subjectList.add(newSubject);
    }

//    삭제를 수행하는 메소드
    public void removeData(int idx) {
        subjectList.remove(idx);
    }

}

<MainActivity.java>

package ddwucom.mobile.test08.adapterclicktest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckedTextView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    SubjectManager subjectManager;
    ArrayList<String> subjectList;
    ArrayAdapter<String> adapter;
    ListView listView;
    EditText etItem;
    Button addButton, editButton;
    int position;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        subjectManager = new SubjectManager();
        subjectList = subjectManager.getSubjectList();

        adapter = new ArrayAdapter<String>(
                this, android.R.layout.simple_list_item_1, subjectList);

        listView = findViewById(R.id.listView);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(itemClickListener);

        etItem = (EditText)findViewById(R.id.etItem);

        addButton = (Button)findViewById(R.id.btnInsert) ; //추가 버튼

        //아이템 추가
        addButton.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {

                subjectList.add(etItem.getText().toString());
                adapter.notifyDataSetChanged(); // listview 갱신
            }
        });

        //롱클릭 시 아이템 삭제
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int pos, long id) {
                subjectList.remove(pos);
                adapter.notifyDataSetChanged();
                // 이벤트 처리 종료 , 여기만 리스너 적용시키고 싶으면 true , 아니면 false
                return true;
            }
        });

    }
    //아이템이 클릭 되었을 때
    AdapterView.OnItemClickListener itemClickListener =
            new AdapterView.OnItemClickListener() {
                public void onItemClick(AdapterView<?> adapterView, View view, int pos, long l) {
       
                    position = pos;
                    etItem.setText(subjectList.get(pos).toString());

                    //아이템 수정
                    editButton = (Button)findViewById(R.id.btnUpdate) ; //수정 버튼
                    editButton.setOnClickListener(new Button.OnClickListener() {
                        public void onClick(View v) {
                            subjectList.set(position, etItem.getText().toString());
                            adapter.notifyDataSetChanged(); // listview 갱신
                        }
                    });

                }
            };


}

1. setOnItemClickListener()

listView.setOnItemClickListener(itemClickListener);

ListView 객체에 리스너를 연결한다. 화면순서와 원본데이터 순서는 같다.

 

2. notifyDataSetChanged()

adapter.notifyDataSetChanged();

리스트에 변경이 일어났을 경우 원본 데이터를 사용하는 어댑터에 변경을 알린다.

AdapterView가 변경이 일어난 리스트의 n번째 위치를 확인하고 해당 위치를 원본데이터로 보내 데이터를 수정/삭제한다. 그 다음 notifyDataSetChanged()를 호출하여 처리 상태를 반영한다.

 

2. setText()

position = pos;
etItem.setText(subjectList.get(pos).toString());

EditText에 클릭된 위치의 과목을 표시한다.