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

ListView에서 데이터베이스 데이터를 Android CheckBox에 바인딩하는 방법


이 예제에서는 ListView의 각 항목에 데이터를 바인딩하고 CheckBox로 선택 여부를 표시하는 방법을 단계별로 살펴봅니다. 실제 프로젝트에서는 SQLite나 Room 같은 데이터베이스에서 읽어온 데이터를 동일한 패턴으로 어댑터에 전달하면 되므로, ListView와 CheckBox를 활용한 데이터 바인딩의 기본 원리를 익히는 데 큰 도움이 됩니다.

1단계 — 새 프로젝트 만들기

Android Studio에서 File → New Project를 선택한 후, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.

2단계 — 메인 레이아웃 작성

res/layout/activity_main.xml 파일에 다음 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="https://schemas.android.com/apk/res/android"
   xmlns:app="https://schemas.android.com/apk/res-auto"
   xmlns:tools="https://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="match_parent"
      android:layout_height="wrap_content"
      tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>

3단계 — 리스트 항목 레이아웃 작성

res/layout/row_item.xml 파일에 다음 코드를 추가합니다. 각 행은 왼쪽에는 항목 이름을 표시하는 TextView, 오른쪽에는 선택 상태를 나타내는 CheckBox가 배치됩니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:padding="10dp"
   android:layout_width="match_parent"
   android:layout_height="wrap_content">
   <TextView
      android:id="@+id/txtName"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentLeft="true"
      android:layout_alignParentStart="true"
      android:layout_centerVertical="true"
      android:textSize="16sp" />
   <CheckBox
      android:id="@+id/checkBox"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentEnd="true"
      android:layout_alignParentRight="true"
      android:layout_alignParentTop="true" />
</RelativeLayout>

4단계 — MainActivity 작성

src/MainActivity.java 파일에 다음 코드를 추가합니다. 안드로이드 버전 이름으로 된 샘플 데이터를 생성하고, 리스트 항목을 클릭하면 해당 항목의 체크 상태가 토글되도록 처리했습니다.

package com.app.sample;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import java.util.ArrayList;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
   ArrayList dataModels;
   ListView listView;
   private CustomAdapter adapter;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      listView = (ListView) findViewById(R.id.listView);
      dataModels = new ArrayList();
      dataModels.add(new DataModel("Apple Pie", false));
      dataModels.add(new DataModel("Banana Bread", false));
      dataModels.add(new DataModel("Cupcake", false));
      dataModels.add(new DataModel("Donut", true));
      dataModels.add(new DataModel("Eclair", true));
      dataModels.add(new DataModel("Froyo", true));
      dataModels.add(new DataModel("Gingerbread", true));
      dataModels.add(new DataModel("Honeycomb", false));
      dataModels.add(new DataModel("Ice Cream Sandwich", false));
      dataModels.add(new DataModel("Jelly Bean", false));
      dataModels.add(new DataModel("Kitkat", false));
      dataModels.add(new DataModel("Lollipop", false));
      dataModels.add(new DataModel("Marshmallow", false));
      dataModels.add(new DataModel("Nougat", false));
      adapter = new CustomAdapter(dataModels, getApplicationContext());
      listView.setAdapter(adapter);
      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
         @Override
         public void onItemClick(AdapterView parent, View view, int position, long id) {
            DataModel dataModel= (DataModel) dataModels.get(position);
            dataModel.checked = !dataModel.checked;
            adapter.notifyDataSetChanged();
         }
      });
   }
}

5단계 — DataModel 작성

src/DataModel.java 파일에 다음 코드를 추가합니다. 항목의 이름과 체크 상태를 함께 담는 모델 클래스입니다.

package com.app.sample;
public class DataModel {
   public String name;
   boolean checked;
   DataModel(String name, boolean checked) {
      this.name = name;
      this.checked = checked;
   }
}

6단계 — CustomAdapter 작성

src/CustomAdapter.java 파일에 다음 코드를 추가합니다. ViewHolder 패턴을 사용해 뷰를 재활용함으로써 스크롤 성능을 개선하고, 각 위치의 데이터를 TextView와 CheckBox에 바인딩합니다.

package com.app.sample;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.TextView;
import androidx.annotation.NonNull;
import java.util.ArrayList;
public class CustomAdapter extends ArrayAdapter{
   private ArrayList dataSet;
   Context mContext;
   // View lookup cache
   private static class ViewHolder {
      TextView txtName;
      CheckBox checkBox;
   }
   public CustomAdapter(ArrayList data, Context context) {
      super(context, R.layout.row_item, data);
      this.dataSet = data;
      this.mContext = context;
   }
   @Override
   public int getCount() {
      return dataSet.size();
   }
   @Override
   public DataModel getItem(int position) {
      return (DataModel) dataSet.get(position);
   }
   @Override
   public View getView(int position, View convertView, @NonNull ViewGroup parent){
      ViewHolder viewHolder;
      final View result;
      if (convertView == null) {
         viewHolder = new ViewHolder();
         convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item, parent, false);
         viewHolder.txtName = (TextView) convertView.findViewById(R.id.txtName);
         viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
         result=convertView;
         convertView.setTag(viewHolder);
      } else {
         viewHolder = (ViewHolder) convertView.getTag();
         result=convertView;
      }
      DataModel item = getItem(position);
      viewHolder.txtName.setText(item.name);
      viewHolder.checkBox.setChecked(item.checked);
      return result;
   }
}

7단계 — 매니페스트 설정

Manifests/AndroidManifest.xml 파일에 다음 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="com.app.sample">
   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:roundIcon="@mipmap/ic_launcher_round"
      android:supportsRtl="true"
      android:theme="@style/AppTheme">
      <activity android:name=".MainActivity">
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   </application>
</manifest>

앱 실행하기

이제 애플리케이션을 실행해 보겠습니다. 실제 Android 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run 아이콘을 클릭하세요. 실행 옵션 목록에서 자신의 모바일 기기를 선택하면, 기기 화면에 아래와 같은 결과가 표시됩니다.

ListView에서 데이터베이스 데이터를 Android CheckBox에 바인딩하는 방법