어댑터뷰란?
여러 개의 뷰를 일정한 형태로 표시하여 보여줄 수 있는 ViewGroup의 일종이다.
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에 클릭된 위치의 과목을 표시한다.
'📱Application > Android' 카테고리의 다른 글
사용자 인터페이스03 - 대화상자(Dialog) (0) | 2022.05.29 |
---|---|
사용자 인터페이스01 - 메뉴(Menu) (0) | 2022.05.27 |
인터페이스 기초03 - 커스텀뷰(Custom View) (0) | 2022.04.25 |
인터페이스 기초02 - 레이아웃(Layout) (0) | 2022.04.25 |
인터페이스 기초 01 - 뷰(View) (1) | 2022.04.24 |