안드로이드 리스트뷰 아이템 추가,수정,삭제. (Android ListView Item Add,Modify,Delete)
1. ListView 아이템 다루기
지금까지의 ListView예제들에서는 Activity의 onCreate()함수에서 아이템에 표시될 데이터를 Adapter에 미리 적용하는 방식만을 사용했습니다. 즉, 최초 ListView 아이템을 구성하고 나서 앱 실행 중에 새로운 아이템을 추가하거나 수정, 삭제하는 코드는 작성하지 않았죠.
하지만 앱을 만들다 보면 아이템이 바뀌는 ListView를 만들어야 하는 상황이 자주 생깁니다. 이번 글에서는 ListView에 새로운 아이템을 추가하거나, 기존 아이템을 수정 또는 삭제하는 방법에 대해 알아보겠습니다.
ListView에서 아이템을 다루는 방법은 ArrayAdapter와 Custom Adapter가 크게 다르지 않으므로 [안드로이드 리스트뷰 기본 사용법]에서 설명한 예제를 바탕으로 진행하겠습니다.
1.1 Adapter의 역할
안드로이드에서의 ListView 활용은 Adapter에 대한 이해와 구현이 대부분의 작업을 차지할 정도로 Adapter는 매우 중요한 개념입니다. 하지만 처음 Adapter를 접하는 사람이라면 Adapter가 무엇인지 처음부터 감을 잡기가 쉽지 않은 게 사실이죠. (만약 과거에 WIN32 API 또는 MFC를 사용해봤다면 더더욱..?)
여기서 잠깐.. 앞에서 이미 여러 차례 언급했던 Adapter에 대한 얘기를 왜 다시 꺼낼까요? 그것은 바로 ListView에 아이템을 추가,수정,삭제할 때 Adapter가 그 모든 역할을 담당하기 때문입니다.
[안드로이드 리스트뷰 기본 사용법]에서 설명한 것처럼 ListView에 아이템을 출력하기 위해서는 Adapter를 사용해야 합니다. Adapter에 데이터를 리스트 형태로 전달하면 getView() 함수에서 ListView에 표시할 View를 반환하는 흐름으로 동작하죠.
ListView의 아이템을 다루는 방법은 어렵지 않습니다. 단지 Adapter에 저장된 리스트의 내용을 추가,수정,삭제한 다음, 데이터가 변경되었음을 알려주어 ListView로 하여금 다시 그리도록 만들기만 하면 됩니다.
2. 아이템 추가, 수정, 삭제
[안드로이드 리스트뷰 기본 사용법]에서 작성했던 ListView에 세 개의 Button을 추가하여 각 기능을 수행하도록 구현하겠습니다.
예제 화면은 다음과 같이 구성됩니다.
2.1 ListView 및 Button 추가
ListView 및 Button이 추가된 Layout 리소스 파일을 작성합니다. 이 때 ListView에 choiceMode 속성을 사용하였습니다. choiceMode를 지정하면 ListView 아이템을 선택 할 수 있는 기능을 사용할 수 있습니다. choiceMode에 대한 자세한 내용은 다음 기회에 다른 예제를 통해 자세히 설명하도록 하겠습니다.
[STEP-1] "activity_main.xml" - MainActivity에 ListView와 Button 추가.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.example.madwin.listviewitemcontrolexample1.MainActivity"
tools:showIn="@layout/activity_main"
android:orientation="vertical">
<ListView
android:id="@+id/listview1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:choiceMode="singleChoice" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Add" />
<Button
android:id="@+id/modify"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Modify" />
<Button
android:id="@+id/delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Delete" />
</LinearLayout>
</LinearLayout>
MainActivity의 onCreate()함수에서 ArrayList와 ListView를 생성합니다. 이 때 choiceMode를 지원하는 "android.R.layout.simple_list_item_single_choice" 리소스를 사용한 것에 주의하세요. "android.R.layout.simple_list_item_single_choice"를 사용하면 ListView 아이템에 TextView와 Radio Button을 가진 View가 표시됩니다.
[STEP-2] "MainActivity.java" - onCreate() 함수에서 ListView 및 Adapter 생성.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// ... 코드 계속
// 빈 데이터 리스트 생성.
final ArrayList<String> items = new ArrayList<String>() ;
// ArrayAdapter 생성. 아이템 View를 선택(single choice)가능하도록 만듦.
final ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_single_choice, items) ;
// listview 생성 및 adapter 지정.
final ListView listview = (ListView) findViewById(R.id.listview1) ;
listview.setAdapter(adapter) ;
// 코드 계속 ...
}
}
2.2 아이템 추가
아이템을 추가하기 위해 ListView의 Adapter에서 리스트를 얻어온 다음, 원하는 위치에 데이터를 추가하고 ListView를 갱신합니다. 예제에서는 가장 마지막에 아이템을 추가합니다.
[STEP-3] "MainActivity.java" - [STEP-2] 아래에 "추가" 버튼에 대한 핸들러 작성.
// add button에 대한 이벤트 처리.
Button addButton = (Button)findViewById(R.id.add) ;
addButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
int count;
count = adapter.getCount();
// 아이템 추가.
items.add("LIST" + Integer.toString(count + 1));
// listview 갱신
adapter.notifyDataSetChanged();
}
}) ;
}
2.3 아이템 수정
아이템을 수정하기 위한 절차 또한 추가하는 것과 동일하게 작성합니다. 즉, Adapter에 지정한 데이터 리스트에서 원하는 위치의 데이터를 수정하고 ListView를 갱신합니다. 현재 선택된 아이템 위치를 얻어오기 위해서는 ListView의 getCheckedItemPosition() 함수를 사용하면 됩니다.
[STEP-4] "MainActivity.java" - [STEP-3] 아래에 "수정" 버튼에 대한 핸들러 작성.
// modify button에 대한 이벤트 처리.
Button modifyButton = (Button)findViewById(R.id.modify) ;
modifyButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
int count, checked ;
count = adapter.getCount() ;
if (count > 0) {
// 현재 선택된 아이템의 position 획득.
checked = listview.getCheckedItemPosition();
if (checked > -1 && checked < count) {
// 아이템 수정
items.set(checked, Integer.toString(checked+1) + "번 아이템 수정") ;
// listview 갱신
adapter.notifyDataSetChanged();
}
}
}
}) ;
}
2.4 아이템 삭제
삭제하는 방법도 추가 및 수정 방법과 동일합니다. 리스트에서 데이터를 삭제하고 ListView를 갱신합니다.
[STEP-5] "MainActivity.java" - [STEP-3] 아래에 "수정" 버튼에 대한 핸들러 작성.
// delete button에 대한 이벤트 처리.
Button deleteButton = (Button)findViewById(R.id.delete) ;
deleteButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
int count, checked ;
count = adapter.getCount() ;
if (count > 0) {
// 현재 선택된 아이템의 position 획득.
checked = listview.getCheckedItemPosition();
if (checked > -1 && checked < count) {
// 아이템 삭제
items.remove(checked) ;
// listview 선택 초기화.
listview.clearChoices();
// listview 갱신.
adapter.notifyDataSetChanged();
}
}
}
}) ;
}
3. 예제 실행 화면
아래는 예제를 실행한 결과 화면입니다.
"Add" 버튼을 클릭했을 때 출력 결과입니다.
아이템을 선택하고 "Modify" 버튼을 클릭했을 때 출력 결과입니다.
아이템을 선택한 다음 "Delete" 버튼을 클릭했을 때 출력 결과입니다.
4. 참고.
- ListView 에 대한 자세한 도움말.
- [안드로이드 개발 참조문서 ListView 항목]을 참조하세요.
- 안드로이드 ListView 기본 사용법.
- [안드로이드 리스트뷰 기본 사용법] 내용을 참조하세요.