์ด์ ์ ์ปค์คํ ๋ฆฌ์ค๋ทฐ์ SQlite๋ฐ์ดํฐ๋ฅผ ๋์ฐ๋ ํฌ์คํ ์ ์๊ณ ํ์๋ค.
๋ง์ฝ SQlite์ ๋ํด ์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ์ด์ ์ ํฌ์คํ ํ ๊ธ์ ์ฝ๊ณ ์ค๋๋ก ์ถ์ฒํ๋ค.
์ด๋ฒ์๋ Custom Listview ์ SQLite DB๋ฅผ ๋์์ฃผ๋๋ก ํด๋ณด๊ฒ ๋ค.
์์ - ๋ ์ด์์
์ฐ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ชจ์ต์ ์ด๋ฌํ ๋ญํญํ๊ณ ๊ท์ค ๊ธฐ์ค ํ ๋ฆฌ์คํธ์ ๋ชจ์ต์ด๋ค
๊ทธ๋ฆฌ๊ณ ์๋ ๋ณด๋ฉด ์์ฉ์ ๋ชฉ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ์ ์๋ ๋ทฐ๋ฅผ ๋ง๋ค์ด๋ ์ํ๋ค
๋ฐ๋ก ๋์์ธ๋ถํฐ ์์ํด๋ณด์
๋งค์ธ์กํฐ๋นํฐ์ ๋ ์ด์์์ ๋์์ธํ๋ฉด
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ListView
android:id="@+id/lv_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_above="@id/linear"
android:divider="@null"
/>
<LinearLayout
android:id="@+id/linear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="10"
android:gravity="center_vertical"
android:layout_alignParentBottom="true"
>
<EditText
android:id="@+id/et_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="8"
android:hint="์
๋ ฅํ ๊ฐ์ ์ ์ผ์ธ์"/>
<Button
android:id="@+id/btn_insert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="์
๋ ฅ"
android:layout_weight="2"
/>
</LinearLayout>
</RelativeLayout>
์ด๋ฒ์๋ ๋ฆฌ์คํธ๋ทฐ์ ์ฌ์ฉ๋ ์์ดํ ์ ๋ ์ด์์์ ์ ์ํด์ผ ํ๋ค.
์ฐ์ ๋ ์ด์์ ํ์ผ์ 2๊ฐ ๋ง๋ค์
item_listview.xml์ ๋ฆฌ์คํธ๋ทฐ์ ์์ดํ ์ ๋ํ ๋์์ธ์ด๊ณ
shape_itembackground.xml์ ์์ดํ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ชจ์์ ๊ฒฐ์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ ํ์ผ์ ์ฝ๋๋ค
shape_itembackground.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<corners
android:radius="10dp"
/>
<solid
android:color="#EEE"
/>
</shape>
item_listview.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="7dp"
android:padding="10dp"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="@drawable/shape_itembackground">
<TextView
android:id="@+id/item_tv_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:textSize="30dp"
android:text="1"/>
<TextView
android:id="@+id/item_tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/item_tv_num"
android:layout_marginLeft="20dp"
android:textSize="30dp"
android:text="๊น์์ฐ"
/>
</RelativeLayout>
</RelativeLayout>
item_listview.xml ํ์ผ์ ๋ณด๋ฉด ๋ ๋ฒ์งธ RelativeLayout์ background="@drawable/shape_itembackground"๋ก ์ ์ฉ๋์ด์๋ค. ์ ๊ฒ ์๊ณ ์๊ณ ์ ๋ชจ์ต์ ๋ณด์ฌ์ฃผ๊ฒ ๋ค.
background="@drawable/shape_itembackground" ์ ์ฉ ์
background="@drawable/shape_itembackground" ์ ์ฉ ํ
ํ์ ์์ผ๋ฉด ์ ์ฉ ์ ํด๋ ๋๋ค.
์์ - ์ฝ๋ฉ
์ด์ ์ฝ๋ฉ์ผ๋ก ๋์ด๊ฐ๊ฒ ๋ค.
ํด๋์ค ํ์ผ์ 3๊ฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์
์ฐ์ SQLite ์ฌ์ฉ์ ํ๊ธฐ ์ํ DbHelper ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ค๋ค ๊ทธ๋ฆฌ๊ณ SQLiteOepnHelper๋ฅผ ์์ํด์ค์ผ ํ๋ค.
DBHelper.class
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class DBHelper extends SQLiteOpenHelper {
final static String DB_NAME = "data.db"; //DB์ด๋ฆ
final static int DB_VERSION = 2; //DB๋ฒ์
//์์ฑ์
public DBHelper(@Nullable Context context) {
super(context, DB_NAME,null,DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//ํ
์ด๋ธ์ ๊ตฌ์กฐ๋ ์ฌ๊ธฐ์ ์ค๊ณ
String qry = "CREATE TABLE student(num INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL)";
sqLiteDatabase.execSQL(qry);
//์์ผ๋ฉด ์ฐ๋ ํ๋ ์๋ฌด ๋ฐ์ดํฐ๋ผ๋ ๋ฃ์ด์ฃผ๊ธฐ
qry = "INSERT INTO student(name) VALUES('ํฉ์๊ณ ')";
sqLiteDatabase.execSQL(qry);
qry = "INSERT INTO student(name) VALUES('๊น์์ฐ')";
sqLiteDatabase.execSQL(qry);
qry = "INSERT INTO student(name) VALUES('์ด์น์')";
sqLiteDatabase.execSQL(qry);
}
//๋ฒ์ ์
๋ฐ์ดํธ ๋ ๋๋ง๋ค ํธ์ถ ๋๋๋ฐ ๋ง์ง๋ง์ onCreate๋ ๊ฐ์ด ์คํ๋๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ๋จผ์ DB์ ์กด์ฌํ๋ ํ
์ด๋ธ๋ค์ ์ง์์ค์ผํจ.
//ํ๋ง๋๋ก ์ด๊ธฐํ์ญํ
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
String qry = "DROP TABLE IF EXISTS student";
sqLiteDatabase.execSQL(qry);
onCreate(sqLiteDatabase);
}
}
DB์ ๋ชจ์์ ์ก๋ ์ค์ํ ์ญํ ์ด ๋ฐ๋ก ์ด DBHelperํด๋์ค์ด๋ค 3๊ฐ์ง ๋ฉ์๋์ ์ญํ ์ ๊ผญ ๊ธฐ์ตํ๋๋ก ํ์
๊ทธ๋ค์์ ๋ฆฌ์คํธ๋ทฐ์ ๋ชฉ๋ก์ ๋์ฐ๋๋ก ๋์์ฃผ๋ ํด๋์ค์ธ adapter๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
ํ์ง๋ง ๊ทธ์ ์ adapter์์ ๊ฐ ์์ดํ ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ฐ์ฒด๊ฐ ํ์ํ๋ฏ๋ก
ListViewAdapterData ํด๋์ค๋ฅผ ๋จผ์ ๊ตฌํํ๊ฒ ๋ค.
ListViewAdapterData.class
package com.example.customlistviewwithsqlite;
public class ListViewAdapterData {
private int num;
private String name;
public void setNum(int num){this.num = num;}
public void setName(String name){this.name = name;}
public int getNum(){return this.num;}
public String getName(){return this.name;}
}
kotlin์ผ๋ก ์ฐ๋ฉด 2์ค์ด๋ฉด ๋๋ ๊ฒ์...
java์ getter setter ์ฌ์ฉ์ ๋ณํ ๊ฐ๋ค
๊ทธ๋ค์์ adapterํด๋์ค๋ฅผ ๊ตฌํํ์
ListViewAdapter.class
package com.example.customlistviewwithsqlite;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
public class ListViewAdapter extends BaseAdapter {
ArrayList<ListViewAdapterData> list = new ArrayList<ListViewAdapterData>();
@Override
public int getCount() {
return list.size(); //๊ทธ๋ฅ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋ฐํํ๋ฉด ๋จ
}
@Override
public Object getItem(int i) {
return list.get(i); //๋ฐฐ์ด์ ์์ดํ
์ ํ์ฌ ์์น๊ฐ์ ๋ฃ์ด ๊ฐ์ ธ์ด
}
@Override
public long getItemId(int i) {
return i; //๊ทธ๋ฅ ์์น๊ฐ์ ๋ฐํํด๋ ๋์ง๋ง ์ํ๋ค๋ฉด ์์ดํ
์ num ์ ๋ฐํํด๋ ๋๋ค.
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
final Context context = viewGroup.getContext();
//๋ฆฌ์คํธ๋ทฐ์ ์์ดํ
์ด ์ธํ๋ ์ดํธ ๋์ด์๋์ง ํ์ธํํ
//์์ดํ
์ด ์๋ค๋ฉด ์๋์ฒ๋ผ ์์ดํ
๋ ์ด์์์ ์ธํ๋ ์ดํธ ํ๊ณ view๊ฐ์ฒด์ ๋ด๋๋ค.
if(view == null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.item_listview,viewGroup,false);
}
//์ด์ ์์ดํ
์ ์กด์ฌํ๋ ํ
์คํธ๋ทฐ ๊ฐ์ฒด๋ค์ view๊ฐ์ฒด์์ ์ฐพ์ ๊ฐ์ ธ์จ๋ค
TextView tvNum = (TextView)view.findViewById(R.id.item_tv_num);
TextView tvName = (TextView)view.findViewById(R.id.item_tv_name);
//ํ์ฌ ํฌ์ง์
์ ํด๋นํ๋ ์์ดํ
์ ๊ธ์๋ฅผ ์ ์ฉํ๊ธฐ ์ํด list๋ฐฐ์ด์์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์จ๋ค.
ListViewAdapterData listdata = list.get(i);
//๊ฐ์ ธ์จ ๊ฐ์ฒด์์ ์๋ ๊ธ์๋ค์ ๊ฐ ๋ทฐ์ ์ ์ฉํ๋ค
tvNum.setText(Integer.toString(listdata.getNum())); //์๋ intํ์ด๋ผ String์ผ๋ก ํ ๋ณํ
tvName.setText(listdata.getName());
return view;
}
//ArrayList๋ก ์ ์ธ๋ list ๋ณ์์ ๋ชฉ๋ก์ ์ฑ์์ฃผ๊ธฐ ์ํจ ๋ค๋ฅธ๋ฐฉ์์ผ๋ก ๊ตฌํํด๋ ๋จ
public void addItemToList(int num, String name){
ListViewAdapterData listdata = new ListViewAdapterData();
listdata.setNum(num);
listdata.setName(name);
//๊ฐ๋ค์ ์กฐ๋ฆฝ์ด ์์ฑ๋ listdata๊ฐ์ฒด ํ๊ฐ๋ฅผ list๋ฐฐ์ด์ ์ถ๊ฐ
list.add(listdata);
}
}
์ด์ ๋ง๋ฌด๋ฆฌ๋ MainActivityํด๋์ค ๊ตฌํ์ด๋ค.
MainActivity.class
package com.example.customlistviewwithsqlite;
import androidx.appcompat.app.AppCompatActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
public class MainActivity extends AppCompatActivity {
ListView lvList;
EditText etText;
Button btnInsert;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//์ฌ๊ธฐ๊น์ง ๋ปํ๋ค
lvList = (ListView)findViewById(R.id.lv_list);
etText = (EditText)findViewById(R.id.et_text);
btnInsert = (Button)findViewById(R.id.btn_insert);
displayList();
}
void displayList(){
//Dbhelper์ ์ฝ๊ธฐ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ SQLiteDatabase์ ๋ด์ ์ฌ์ฉ์ค๋น
DBHelper helper = new DBHelper(this);
SQLiteDatabase database = helper.getReadableDatabase();
//Cursor๋ผ๋ ๊ทธ๋ฆ์ ๋ชฉ๋ก์ ๋ด์์ฃผ๊ธฐ
Cursor cursor = database.rawQuery("SELECT * FROM student",null);
//๋ฆฌ์คํธ๋ทฐ์ ๋ชฉ๋ก ์ฑ์์ฃผ๋ ๋๊ตฌ์ธ adapter์ค๋น
ListViewAdapter adapter = new ListViewAdapter();
//๋ชฉ๋ก์ ๊ฐ์๋งํผ ์ํํ์ฌ adapter์ ์๋ list๋ฐฐ์ด์ add
while(cursor.moveToNext()){
//num ํ์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ์ ์์ผ๋ 0๋ฒ์ด ๋๊ณ , name์ 1๋ฒ
adapter.addItemToList(cursor.getInt(0),cursor.getString(1));
}
//๋ฆฌ์คํธ๋ทฐ์ ์ด๋ํฐ ๋์์ ์ฌํ ์ค๊ณํ adapter๋ก ์ค์
lvList.setAdapter(adapter);
}
}
์ฌ๊ธฐ๊น์ง ์์ฑํ๊ณ ์คํ์ ํด๋ณด๋ฉด
์ ์์ ์ผ๋ก ๋ฆฌ์คํธ๋ค์ด ๋ฌ๋ค.
ํ์ง๋ง ์๋์ ์ถ๊ฐํ๋ ๋ทฐ์ ๊ธฐ๋ฅ์ ์์ง ๊ตฌํํ์ง ์์๋ค. ๊ทธ๋์ MainActivityํด๋์ค์ ์์ ์ด ํ์ํ๋ค.
MainActivity.class (Insert๋ฌธ ์ถ๊ฐ , ๋ฒํผ ํด๋ฆญ ์ด๋ฒคํธ ๊ตฌํ)
package com.example.customlistviewwithsqlite;
import androidx.appcompat.app.AppCompatActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
public class MainActivity extends AppCompatActivity {
ListView lvList;
EditText etText;
Button btnInsert;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//์ฌ๊ธฐ๊น์ง ๋ปํ๋ค
lvList = (ListView)findViewById(R.id.lv_list);
etText = (EditText)findViewById(R.id.et_text);
btnInsert = (Button)findViewById(R.id.btn_insert);
displayList();
btnInsert.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View view) {
insertStudent(etText.getText().toString());
}
});
}
void displayList(){
//Dbhelper์ ์ฝ๊ธฐ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ SQLiteDatabase์ ๋ด์ ์ฌ์ฉ์ค๋น
DBHelper helper = new DBHelper(this);
SQLiteDatabase database = helper.getReadableDatabase();
//Cursor๋ผ๋ ๊ทธ๋ฆ์ ๋ชฉ๋ก์ ๋ด์์ฃผ๊ธฐ
Cursor cursor = database.rawQuery("SELECT * FROM student",null);
//๋ฆฌ์คํธ๋ทฐ์ ๋ชฉ๋ก ์ฑ์์ฃผ๋ ๋๊ตฌ์ธ adapter์ค๋น
ListViewAdapter adapter = new ListViewAdapter();
//๋ชฉ๋ก์ ๊ฐ์๋งํผ ์ํํ์ฌ adapter์ ์๋ list๋ฐฐ์ด์ add
while(cursor.moveToNext()){
//num ํ์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ์ ์์ผ๋ 0๋ฒ์ด ๋๊ณ , name์ 1๋ฒ
adapter.addItemToList(cursor.getInt(0),cursor.getString(1));
}
//๋ฆฌ์คํธ๋ทฐ์ ์ด๋ํฐ ๋์์ ์ฌํ ์ค๊ณํ adapter๋ก ์ค์
lvList.setAdapter(adapter);
}
void insertStudent(String name){
//Dbhelper์ ์ฐ๊ธฐ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ด
DBHelper helper = new DBHelper(this);
SQLiteDatabase database = helper.getReadableDatabase();
String qry = "INSERT INTO student(name) VALUES('"+name+"')";
database.execSQL(qry); //๋ง๋ค์ด์ค ์ฟผ๋ฆฌ๋ฌธ ์คํ
displayList(); //๋ฆฌ์คํธ๋ทฐ ์๋ก๊ณ ์นจ
}
}
๊ฒฐ๊ณผ
์ ๋ง ๋ฆฌ์คํธ๋ทฐ ํ๋ ๊ตฌํํ๊ฒ ๋ค๊ณ ์๊ฐ ์์ฒญ ๋ฒ๋ฆฌ๋ ๊ฒ ๊ฐ๋ค.
๊ทผ๋ฐ ์ด์๊ณ ์ข์ ์ฑ์ ๋ง๋ค๊ธฐ ์ํด์๋ ์ด์ฉ ์ ์๋ ๋ฒ ใ ใ
๋ง์ฝ ํ๋๊ฐ num, name ๋ฟ ๋ง ์๋๋ผ
num, name, age, email ๋ฑ์ ํ์ํ๊ณ ์ถ๋ค๋ฉด ํ์๋ก ๋ช๊ฐ์ง๋ฅผ ์์ ํด์ฃผ๋ฉด ๋๋ค.
dbhelperํด๋์ค์ ์ฟผ๋ฆฌ๋ฌธ ์ค๊ณ๋ถ๋ถ์์ age,email ์ถ๊ฐ
item_listview.xml ์ textview ์ถ๊ฐ (์ํ๋ค๋ฉด)
ListViewAdapterData.class ์ get set ์ถ๊ฐ
ListViewAdapter.class ์ addItemToList()ํจ์์ ์ธ์๋ ๋ก์ง ์ถ๊ฐ
ListViewAdapter.class ์ getView() ํจ์์ tvAge.setText(), tvEmail.setText ๋ฑ ์ถ๊ฐ
(์ข ๋ง๋..?)
๊ทผ๋ฐ ์ด์ฐจํผ ํ๊ตฐ๋ฐ๋ฅผ ๋ฐ๊พธ๋ฉด ๋ค๋ฅธ๋ถ๋ถ์์ ์๋ฌํ์๋ก ๋จ๊ธฐ ๋๋ฌธ์ ์ด๋ ๋ฐ๊ฟ์ผ๋๋์ง ๊ธ๋ฐฉ ํ์ ํ๋ค.
๊ทธ๋ผ ์ค๋ ํฌ์คํ ์ ์ฌ๊ธฐ๊น์ง ํ๋๋ก ํ๊ฒ ๋ค.