본문 바로가기
ICIA 수업일지

2021.09.28 수업일지(안드로이드 기초, SQLite)

by 주성씨 2021. 9. 28.

- 어제 작업했었던 ex03에서 이미지 업로드를 해보겠다.

앱 사용 권한으로 인해서 어제 업로드를 못했었다. 사용자에 의한 권한 설정이 예전에 비해서 강화되었기 때문에 이를 설정해주는 코드를 생성하도록 하겠다.

 

- src/main/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.ex03">
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
.....
</manifest>

 

- 어플이 최초 시작했을때 권한을 설정할것인지 alert하도록 하겠다.

- src/main/java/com/example/ex03/MainActivity.java

package com.example.ex03;

....

import com.google.android.material.floatingactionbutton.FloatingActionButton;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    AddressDB addressDB;
    SQLiteDatabase db;
    Cursor cursor;
    ListView list;
    MyAdapter myAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
		// 최초 실행 시 권한여부 물음
        permissionCheck();
....
....
    public void permissionCheck(){
        String[] permissions= {Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA };
        ArrayList<String> checkPermission=new ArrayList<>();

        for(String permission:permissions){
            if(ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
                checkPermission.add(permission);
            }
        }
        if(checkPermission.size() > 0){
            String[] reqPermission=checkPermission.toArray(new String[checkPermission.size()]);
            ActivityCompat.requestPermissions(this, reqPermission,100);
        }
    }
}

 

 

- insert 시 사진이 들어간 경로를 sysout 해주도록 하겠다.

- src/main/java/com/example/ex03/InsertActivity.java

.....
        // 엘범실행
        photo = findViewById(R.id.photo);
        photo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(intent, 0);
            }
        });
    }
    // 엘범 실행 후 이쪽으로 옴
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==0){
            photo.setImageURI(data.getData());
            Cursor cursor = getContentResolver().query(data.getData(), null, null, null, null);
            cursor.moveToFirst();
            strPhoto = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            System.out.println("............" + strPhoto);
            cursor.close();
        }
    }
.....

 

- src/main/java/com/example/ex03/MainActivity.java

.....
    public class MyAdapter extends CursorAdapter {
        public MyAdapter(Context context, Cursor c) {
            super(context, c);
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
            return getLayoutInflater().inflate(R.layout.item, viewGroup, false);
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            ImageView photo = view.findViewById(R.id.photo);
            String strPhoto = cursor.getString(1);
            if(strPhoto.equals("")){ // renew
                photo.setImageResource(R.drawable.ic_baseline_person_24);
            }else{
                photo.setImageBitmap(BitmapFactory.decodeFile(strPhoto));
            }
            TextView name = view.findViewById(R.id.name);
            name.setText(cursor.getString(2));
            TextView tel = view.findViewById(R.id.tel);
            tel.setText(cursor.getString(3));
            TextView juso = view.findViewById(R.id.juso);
            juso.setText(cursor.getString(4));
        }
    }
.....

 

확인

 

- 새로운 프로젝트 ex04를 생성해주도록 하겠다.

- empty activity - named ex04 - save location data\android\ex04

 

- src/main/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.ex04">
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <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>

 

- src/main/java/com/example/ex04/MainActivity.java

package com.example.ex04;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

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

        permissionCheck();
    }

    public void permissionCheck(){
        String[] permissions= {Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA };
        ArrayList<String> checkPermission=new ArrayList<>();

        for(String permission:permissions){
            if(ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
                checkPermission.add(permission);
            }
        }
        if(checkPermission.size() > 0){
            String[] reqPermission=checkPermission.toArray(new String[checkPermission.size()]);
            ActivityCompat.requestPermissions(this, reqPermission,100);
        }
    }
}

 

- 이제 엘범과 카메라를 이용가능하다.

- 메뉴 이미지 drawable에서 vector asset을 이용해 upload 하겠다.

- src/main/res/drawable/(new)ic_menu.xml

- src/main/java/com/example/ex04/MainActivity.java

package com.example.ex04;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

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

        permissionCheck();

        getSupportActionBar().setTitle("상품관리");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu);
    }
.....

 

확인

 

 

- 왼쪽 상단 메뉴 버튼 및 드래그를 통해서 layout이 뜨도록 하겠다.

- build.gradle

.....
dependencies {
.....
    implementation 'com.android.support:design:30.0.0'
    implementation 'de.hdodenhof:circleimageview:3.1.0'
}

 

- src/main/res/layout/(new)drawer_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="300sp"
    android:layout_height="match_parent"
    android:background="#000000"
    android:id="@+id/drawerView"
    android:orientation="vertical"
    android:layout_gravity="start">
    <de.hdodenhof.circleimageview.CircleImageView
        android:layout_width="200sp"
        android:layout_height="300sp"
        android:src="@mipmap/ic_launcher"
        android:layout_gravity="center_horizontal"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:textColor="#FFFFFF"
        android:textSize="30sp"
        android:text="이주성"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="30sp"/>
</LinearLayout>

 

- src/main/res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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"
    android:id="@+id/drawerLayout">
    <include layout="@layout/drawer_view"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

</androidx.drawerlayout.widget.DrawerLayout>

 

- src/main/java/com/example/ex04/MainActivity.java

package com.example.ex04;

.....

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
.....
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home:
                DrawerLayout drawerLayout = findViewById(R.id.drawerLayout);
                LinearLayout drawerView = findViewById(R.id.drawerView);
                if(drawerLayout.isDrawerOpen(drawerView)){
                    drawerLayout.closeDrawer(drawerView);
                }else{
                    drawerLayout.openDrawer(drawerView);
                }
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    public void permissionCheck(){
.....
    }
}

 

확인

 

 

- src/main/res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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"
    android:id="@+id/drawerLayout">
    <include layout="@layout/drawer_view"/>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="20sp">
        <ListView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_baseline_add_24"
            android:backgroundTint="#000000"
            app:borderWidth="0sp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"/>
    </RelativeLayout>
</androidx.drawerlayout.widget.DrawerLayout>

 

- src/main/res/drawable/(new)ic_baseline_insert_photo_24.xml

- src/main/res/layout/(new)item.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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="#FFEB3B"
    android:padding="10sp"
    android:layout_margin="10sp">
    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/photo"
        android:layout_width="70sp"
        android:layout_height="70sp"
        android:src="@drawable/ic_baseline_insert_photo_24"
        app:civ_border_width="1sp"
        app:civ_border_color="#000000"
        android:layout_marginRight="20sp"/>
    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="상품명"
        android:textSize="20sp"
        android:layout_toRightOf="@id/photo"
        android:textStyle="bold"/>
    <TextView
        android:id="@+id/company"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="제조사"
        android:textSize="15sp"
        android:layout_toRightOf="@id/photo"
        android:layout_below="@id/name"/>
    <TextView
        android:id="@+id/price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="상품가격"
        android:textSize="15sp"
        android:layout_toRightOf="@id/photo"
        android:layout_below="@id/company"/>
</RelativeLayout>

 

- db를 생성하는 클래스를 만들도록 하겠다.

- src/main/java/com/example/ex04/(new)ProductDB.java

package com.example.ex04;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

public class ProductDB extends SQLiteOpenHelper {
    public ProductDB(@Nullable Context context) {
        super(context, "product.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table product(_id integer primary key autoincrement, name text, company text, price integer,photo text)";
        db.execSQL(sql);
        sql = "insert into product(name,company, price, photo) values('세탁기', '엘지', 10000000)";
        db.execSQL(sql);
        sql = "insert into product(name,company, price, photo) values('냉장고', '대우', 15000000)";
        db.execSQL(sql);
        sql = "insert into product(name,company, price, photo) values('스타일러', '삼성', 12000000)";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

 

- src/main/java/com/example/ex04/MainActivity.java

package com.example.ex04;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.drawerlayout.widget.DrawerLayout;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import de.hdodenhof.circleimageview.CircleImageView;

public class MainActivity extends AppCompatActivity {
    ProductDB productDB;
    SQLiteDatabase db;
    Cursor cursor;
    MyAdapter myAdapter;
    ListView list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        permissionCheck();

        getSupportActionBar().setTitle("상품관리");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu);

        productDB = new ProductDB(this);
        db=productDB.getWritableDatabase();
        cursor = db.rawQuery("select * from product order by _id desc", null);

        myAdapter = new MyAdapter(this,cursor);
        list=findViewById(R.id.list);
        list.setAdapter(myAdapter);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home:
                DrawerLayout drawerLayout = findViewById(R.id.drawerLayout);
                LinearLayout drawerView = findViewById(R.id.drawerView);
                if(drawerLayout.isDrawerOpen(drawerView)){
                    drawerLayout.closeDrawer(drawerView);
                }else{
                    drawerLayout.openDrawer(drawerView);
                }
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    public class MyAdapter extends CursorAdapter{

        public MyAdapter(Context context, Cursor c) {
            super(context, c);
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
            return getLayoutInflater().inflate(R.layout.item,viewGroup,false);
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            CircleImageView photo = view.findViewById(R.id.photo);
            photo.setImageResource(R.drawable.ic_baseline_insert_photo_24);
            TextView name = view.findViewById(R.id.name);
            name.setText(cursor.getString(1));
            TextView company = view.findViewById(R.id.company);
            company.setText(cursor.getString(2));
            TextView price = view.findViewById(R.id.price);
            DecimalFormat df = new DecimalFormat("#,###원");
            int intPrice = cursor.getInt(3);
            String strPrice = df.format(intPrice);
            price.setText(strPrice);
        }
    }

    public void permissionCheck(){
        String[] permissions= {Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA };
        ArrayList<String> checkPermission=new ArrayList<>();

        for(String permission:permissions){
            if(ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
                checkPermission.add(permission);
            }
        }
        if(checkPermission.size() > 0){
            String[] reqPermission=checkPermission.toArray(new String[checkPermission.size()]);
            ActivityCompat.requestPermissions(this, reqPermission,100);
        }
    }
}

 

확인

 

 

- 홈에서 오른쪽 상단에 메뉴 버튼을 통해서 상품을 정렬해줄 수 있도록 하겠다.

- src/main/res/(new)menu/(new)main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/asc"
        android:title="낮은가격순정렬"/>
    <item
        android:id="@+id/desc"
        android:title="높은가격순정렬"/>
    <item
        android:id="@+id/name"
        android:title="이름순정렬"/>
    <item
        android:id="@+id/company"
        android:title="제조사순정렬"/>
    <item
        android:id="@+id/id"
        android:title="최신상품순정렬"/>
</menu>

 

- src/main/java/com/example/ex04/MainActivity.java

.....
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }

    public void permissionCheck(){
        String[] permissions= {Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA };
        ArrayList<String> checkPermission=new ArrayList<>();

        for(String permission:permissions){
            if(ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
                checkPermission.add(permission);
            }
        }
        if(checkPermission.size() > 0){
            String[] reqPermission=checkPermission.toArray(new String[checkPermission.size()]);
            ActivityCompat.requestPermissions(this, reqPermission,100);
        }
    }
}

 

확인

 

 

- 이제 특정 id를 통해서 정렬해주는 switch문을 생성하도록 하겠다.

- src/main/java/com/example/ex04/MainActivity.java

.....
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home:
                DrawerLayout drawerLayout = findViewById(R.id.drawerLayout);
                LinearLayout drawerView = findViewById(R.id.drawerView);
                if(drawerLayout.isDrawerOpen(drawerView)){
                    drawerLayout.closeDrawer(drawerView);
                }else{
                    drawerLayout.openDrawer(drawerView);
                }
                break;
            case R.id.desc:
                cursor = db.rawQuery("select * from product order by price desc", null);
                myAdapter.changeCursor(cursor);
                break;
            case R.id.asc:
                cursor = db.rawQuery("select * from product order by price", null);
                myAdapter.changeCursor(cursor);
                break;
            case R.id.name:
                cursor = db.rawQuery("select * from product order by name", null);
                myAdapter.changeCursor(cursor);
                break;
            case R.id.company:
                cursor = db.rawQuery("select * from product order by company", null);
                myAdapter.changeCursor(cursor);
                break;
            case R.id.id:
                cursor = db.rawQuery("select * from product order by _id", null);
                myAdapter.changeCursor(cursor);
                break;
        }
        return super.onOptionsItemSelected(item);
    }
.....

 

확인

 

- 이제 검색어를 통해서 아이템을 정렬해보겠다.

- 우선 아이콘을 생성해주도록 하겠다.

- src/main/res/menu/main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/asc"
        android:title="낮은가격순정렬"/>
    <item
        android:id="@+id/desc"
        android:title="높은가격순정렬"/>
    <item
        android:id="@+id/name"
        android:title="이름순정렬"/>
    <item
        android:id="@+id/company"
        android:title="제조사순정렬"/>
    <item
        android:id="@+id/id"
        android:title="최신상품순정렬"/>
    <item
        android:id="@+id/search"
        android:title="search"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="android.widget.SearchView"/>
</menu>

 

- 글자가 입력될때 search 해주도록 하겠다.

- src/main/java/com/example/ex04/MainActivity.java

.....
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        MenuItem search = menu.findItem(R.id.search);
        SearchView searchView = (SearchView)search.getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                String query = "'%"+ s +"%'";
                cursor = db.rawQuery("select * from product where name like "+ query + " or company like "+ query, null);
                myAdapter.changeCursor(cursor);
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }
.....

 

확인

 

- 상품등록 레이아웃을 만들고 뒤로가기 버튼을 활성화해주겠다.

- src/main/java/com/example/ex04/(new)InsertActivity.java

package com.example.ex04;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.MenuItem;

public class InsertActivity extends AppCompatActivity {

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

        getSupportActionBar().setTitle("상품등록");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

 

- src/main/java/com/example/ex04/MainActivity.java

package com.example.ex04;

.....

import com.google.android.material.floatingactionbutton.FloatingActionButton;

import java.text.DecimalFormat;
import java.util.ArrayList;

import de.hdodenhof.circleimageview.CircleImageView;

public class MainActivity extends AppCompatActivity {
    ProductDB productDB;
    SQLiteDatabase db;
    Cursor cursor;
    MyAdapter myAdapter;
    ListView list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        permissionCheck();

        getSupportActionBar().setTitle("상품관리");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu);

        productDB = new ProductDB(this);
        db=productDB.getWritableDatabase();
        cursor = db.rawQuery("select * from product order by _id desc", null);

        myAdapter = new MyAdapter(this,cursor);
        list=findViewById(R.id.list);
        list.setAdapter(myAdapter);

        FloatingActionButton add = findViewById(R.id.add);
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, InsertActivity.class);
                startActivity(intent);
            }
        });
    }
    
.....

 

- src/main/res/layout/activity_insert.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".InsertActivity"
    android:padding="20sp">
    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/photo"
        android:layout_width="250sp"
        android:layout_height="250sp"
        android:src="@drawable/ic_baseline_insert_photo_24"
        app:civ_border_width="2sp"
        app:civ_border_color="#4CAF50"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="20sp"
        android:layout_marginTop="20sp"/>
    <EditText
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="상품명"
        android:textSize="20sp"
        android:layout_below="@id/photo"/>
    <EditText
        android:id="@+id/company"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="제조사명"
        android:textSize="20sp"
        android:layout_below="@id/name"/>
    <EditText
        android:id="@+id/price"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="상품가격"
        android:textSize="20sp"
        android:inputType="number"
        android:layout_below="@id/company"/>
    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_baseline_add_24"
        android:backgroundTint="#000000"
        app:borderWidth="0sp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"/>
</RelativeLayout>

 

확인

 

 

- insert에서 이미지를 클릭해 엘범을 오픈하고 이미지를 등록해주도록 하겠다.

- src/main/java/com/example/ex04/InsertActivity.java

package com.example.ex04;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.MenuItem;
import android.view.View;

import de.hdodenhof.circleimageview.CircleImageView;

public class InsertActivity extends AppCompatActivity {
    CircleImageView photo;
    String strPhoto;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_insert);

        getSupportActionBar().setTitle("상품등록");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        photo = findViewById(R.id.photo);
        photo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(intent,0);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==0){
            photo.setImageURI(data.getData());
            Cursor cursor = getContentResolver().query(data.getData(), null, null, null, null);
            cursor.moveToFirst();
            strPhoto = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            System.out.println("............" + strPhoto);
            cursor.close();
        }
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

 

이미지 데이터 경로 확인

 

- src/main/java/com/example/ex04/InsertActivity.java

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

        getSupportActionBar().setTitle("상품등록");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        productDB = new ProductDB(this);
        db=productDB.getWritableDatabase();

        photo = findViewById(R.id.photo);
        photo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(intent,0);
            }
        });

        name = findViewById(R.id.name);
        company = findViewById(R.id.company);
        price = findViewById(R.id.price);

        FloatingActionButton add = findViewById(R.id.add);
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog.Builder box = new AlertDialog.Builder(InsertActivity.this);
                box.setMessage("수정하실래요?");
                box.setNegativeButton("아니요",null);
                box.setPositiveButton("예", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        String strName = name.getText().toString();
                        String strCompany = company.getText().toString();
                        String strPrice = price.getText().toString();
                        String sql = "insert into product(name, company, price, photo) values(";
                        sql+="'"+strName+"',";
                        sql+="'"+strCompany+"',";
                        sql+= strPrice+",";
                        sql+="'"+strPhoto+"')";
                        db.execSQL(sql);
                        finish();
                    }
                });
                box.show();
            }
        });
    }
.....

 

- src/main/java/com/example/ex04/MainActivity.java

.....
    @Override
    protected void onRestart() {
        String sql = "select * from product";
        String order = " order by _id desc";
        cursor = db.rawQuery(sql+order,null);
        myAdapter.changeCursor(cursor);
        super.onRestart();
    }
}

 

확인

 

- 상품을 클릭하면 정보를 읽어오는 액티비티를 만들겠다.

- src/main/java/com/example/ex04/ReadActivity.java

package com.example.ex04;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.MenuItem;

public class ReadActivity extends AppCompatActivity {

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

        getSupportActionBar().setTitle("상품정보");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch(item.getItemId()){
            case android.R.id.home:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

 

- src/main/java/com/example/ex04/MainActivity.java

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

        permissionCheck();

        getSupportActionBar().setTitle("상품관리");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu);

        productDB = new ProductDB(this);
        db=productDB.getWritableDatabase();
        cursor = db.rawQuery("select * from product order by _id desc", null);

        myAdapter = new MyAdapter(this,cursor);
        list=findViewById(R.id.list);
        list.setAdapter(myAdapter);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() { // new
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent intent = new Intent(MainActivity.this, ReadActivity.class);
                intent.putExtra("id",cursor.getInt(0));
                startActivity(intent);
            }
        });

        FloatingActionButton add = findViewById(R.id.add);
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, InsertActivity.class);
                startActivity(intent);
            }
        });
    }
.....

 

- src/main/java/com/example/ex04/ReadActivity.java

package com.example.ex04;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;

import com.google.android.material.floatingactionbutton.FloatingActionButton;

import de.hdodenhof.circleimageview.CircleImageView;

public class ReadActivity extends AppCompatActivity {
    ProductDB productDB;
    SQLiteDatabase db;
    Cursor cursor;
    EditText name, company, price;
    CircleImageView photo;
    String strPhoto;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_insert);

        getSupportActionBar().setTitle("상품정보");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        name = findViewById(R.id.name);
        company = findViewById(R.id.company);
        price = findViewById(R.id.price);
        photo = findViewById(R.id.photo);
        photo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(intent,0);
            }
        });
        Intent intent = getIntent();
        int id = intent.getIntExtra("id",0);

        productDB = new ProductDB(this);
        db = productDB.getWritableDatabase();

        cursor = db.rawQuery("select * from product where _id="+id,null);
        if(cursor.moveToNext()){
            name.setText(cursor.getString(1));
            company.setText(cursor.getString(2));
            price.setText(cursor.getString(3));
            if(cursor.getString(4)==null || cursor.getString(4).equals("")){
                photo.setImageResource(R.drawable.ic_baseline_insert_photo_24);
            }else{
                // 비트맵으로 변환해서 데이터를 넣는다.
                photo.setImageBitmap(BitmapFactory.decodeFile(cursor.getString(4)));
            }
        }

        FloatingActionButton edit = findViewById(R.id.add);
        edit.setImageResource(R.drawable.ic_baseline_edit_24);
        edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog.Builder box = new AlertDialog.Builder(ReadActivity.this);
                box.setMessage("수정하시겠습니까?");
                box.setNegativeButton("아니오",null);
                box.setPositiveButton("예", null);
                box.show();
            }
        });
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch(item.getItemId()){
            case android.R.id.home:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==0){
            photo.setImageURI(data.getData());
            Cursor cursor = getContentResolver().query(data.getData(), null, null, null, null);
            cursor.moveToFirst();
            strPhoto = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            System.out.println("............" + strPhoto);
            cursor.close();
        }
    }

}

 

 

확인

 

 

- 이제 삭제작업을 하도록 하겠다.

- src/main/res/menu/(new)read.xml

생성 경로

 

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:title="삭데"
        android:id="@+id/delete"
        android:icon="@drawable/ic_baseline_delete_24"
        app:showAsAction="always"/>
</menu>

 

- src/main/java/com/example/ex04/ReadActivity.java

.....
    @Override // new
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.read,menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch(item.getItemId()){
            case android.R.id.home:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==0){
            photo.setImageURI(data.getData());
            Cursor cursor = getContentResolver().query(data.getData(), null, null, null, null);
            cursor.moveToFirst();
            strPhoto = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            System.out.println("............" + strPhoto);
            cursor.close();
        }
    }

}

 

확인

 

 

- 이제 삭제할 수 있는 쿼리문을 생성하고 실행할 수 있도록 하겠다.

- src/main/java/com/example/ex04/ReadActivity.java

.....
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch(item.getItemId()){
            case android.R.id.home:
                finish();
                break;
            case R.id.delete: // new
                AlertDialog.Builder box = new AlertDialog.Builder(this);
                box.setMessage("삭제하시겠습니까?");
                box.setPositiveButton("예", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        String sql = "delete from product where _id="+id;
                        db.execSQL(sql);
                        finish();
                    }
                });
                box.setNegativeButton("아니요", null);
                box.show();
        }
        return super.onOptionsItemSelected(item);
    }
.....

 

 

확인

 

 

- 카카오 검색 API를 이용해 도서검색 APP을 만들어보도록 하겠다.

- src/main/java/com/example/ex04/(new)BookActivity.java

 

- src/main/java/com/example/ex04/(new)Kakao.java - java class

package com.example.ex04;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Kakao {
    public static String connect(String apiURL) {
        try {
            URL url = new URL(apiURL);
            HttpURLConnection con = (HttpURLConnection)url.openConnection();
            con.setRequestMethod("GET");
            con.setRequestProperty("Authorization", "KakaoAK 'REST API 키'");
            int responseCode = con.getResponseCode();
            BufferedReader br;
            if(responseCode==200) { // 정상 호출인 경우
                br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
            } else { //에러 발생가 발생한 경우
                br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
            }
            String inputLine;
            StringBuffer response = new StringBuffer();
            while ((inputLine = br.readLine()) != null) {
                response.append(inputLine);
            }
            br.close();
            System.out.println(response.toString());
            return response.toString();
        }catch (Exception e) {
            return e.toString();
        }
    }
}

 

- 인터넷을 통해서 카카오 서버에 접근하기 위해서 권한 처리를 해준다.

- book액티비티를 시작 액티비티로 설정해준다.

- src/main/AndroidManifest.xml

.....
    <uses-permission android:name="android.permission.INTERNET"/>
.....
        <activity android:name=".BookActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
.....

 

- src/main/java/com/example/ex04/BookActivity.java

package com.example.ex04;

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;

public class BookActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_book);
        new KakaoThread().execute();
    }

    // 카카오 서버 접속을 위한 thread 설정
    class KakaoThread extends AsyncTask<String, String, String> {

        @Override
        protected String doInBackground(String... strings) {
            String result = Kakao.connect("https://dapi.kakao.com/v3/search/book?target=title&query=안드로이드");
            return null;
        }
    }

}

 

확인

 

- 데이터 파싱작업을 해주도록 하겠다.

파싱? : 파싱은 어떤 페이지(문서, html 등)에서 내가 원하는 데이터를 특정 패턴이나 순서로 추출해 가공하는 것을 말한다. 이러한 파서(parser) 역할을 하는 컴퓨터가 구문 트리(parse tree)로 재구성하는 구문 분석 과정을 뜻한다.

 

- src/main/java/com/example/ex04/BookActivity.java

package com.example.ex04;

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;

public class BookActivity extends AppCompatActivity {
    JSONArray jsonArray = new JSONArray();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_book);
        new KakaoThread().execute();
    }

    // 카카오 서버 접속을 위한 thread 설정
    class KakaoThread extends AsyncTask<String, String, String> {

        @Override
        protected String doInBackground(String... strings) {
            String result = Kakao.connect("https://dapi.kakao.com/v3/search/book?target=title&query=안드로이드");

            // 데이터 파싱
            try {
                jsonArray = new JSONObject(result).getJSONArray("documents");
                for(int i = 0; i<jsonArray.length(); i++){
                    JSONObject obj = jsonArray.getJSONObject(i);
                    System.out.println(obj.getString("title")+obj.getString("authors"));
                }
            }catch (Exception e){
                System.out.println("오류 : "+e.toString());
            }

            return null;
        }
    }

}

 

- src/main/res/layout/activity_book.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".BookActivity">
    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

 

- src/main/res/layout/(new)item_book.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:padding="10sp">
    <ImageView
        android:id="@+id/image"
        android:layout_width="70sp"
        android:layout_height="70sp"
        android:src="@mipmap/ic_launcher"
        android:layout_marginRight="20sp"/>
    <TextView
    android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="책제목"
    android:layout_toRightOf="@id/image"
        android:textSize="15sp"
    />
    <TextView
        android:id="@+id/authors"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="책저자"
        android:layout_toRightOf="@id/image"
        android:layout_below="@id/title"
        android:textSize="15sp"
        />
    <TextView
        android:id="@+id/price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="책가격"
        android:layout_toRightOf="@id/image"
        android:layout_below="@id/authors"
        android:textSize="15sp"
        />
</RelativeLayout>

 

- 라이브러리 추가

- build.gradle

    implementation 'com.squareup.picasso:picasso:2.5.2'

 

- 내꺼

- src/main/java/com/example/ex04/BookActivity.java

package com.example.ex04;

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import org.json.JSONArray;
import org.json.JSONObject;
import org.w3c.dom.Text;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;

public class BookActivity extends AppCompatActivity {
    JSONArray jsonArray = new JSONArray();
    BookAdapter bookAdapter = new BookAdapter();
    ListView list;

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

        list = findViewById(R.id.list);
        new KakaoThread().execute();
    }

    // 카카오 서버 접속을 위한 thread 설정
    class KakaoThread extends AsyncTask<String, String, String> {

        @Override
        protected String doInBackground(String... strings) {
            String result = Kakao.connect("https://dapi.kakao.com/v3/search/book?target=title&query=안드로이드");

            // 데이터 파싱
            try {
                jsonArray = new JSONObject(result).getJSONArray("documents");
                for(int i = 0; i<jsonArray.length(); i++){
                    System.out.println("길이 :"+jsonArray.length());
                    JSONObject obj = jsonArray.getJSONObject(i);
                    System.out.println(obj.getString("title")+obj.getString("authors"));
                }
            }catch (Exception e){
                System.out.println("오류 : "+e.toString());
            }

            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            list.setAdapter(bookAdapter);
        }
    }

    // 책 어뎁터
    public class BookAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            return jsonArray.length();
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        @Override
        public View getView(int position, View view, ViewGroup viewGroup) {
            view = getLayoutInflater().inflate(R.layout.item_book, viewGroup, false);
            TextView title = viewGroup.findViewById(R.id.title);
            TextView authors = viewGroup.findViewById(R.id.authors);
            TextView price = viewGroup.findViewById(R.id.price);
            ImageView image = viewGroup.findViewById(R.id.image);
            try {
                JSONObject obj = jsonArray.getJSONObject(position);
                title.setText(obj.getString("title"));
                authors.setText(obj.getString("authors"));
                DecimalFormat df = new DecimalFormat("#,###원");
                price.setText(df.format(obj.getInt("price")));
                if(obj.getString("thumbnail")==null || obj.getString("thumbnail").equals("")){
                    image.setImageResource(R.drawable.ic_launcher_background);
                }else{
                    Picasso.with(BookActivity.this).load(obj.getString("thumbnail")).into(image);
                }
            }catch (Exception e){
                System.out.println("오류 : "+e.toString());
            }
            return view;
        }
    }
}

 

- 선생님꺼

public class BookActivity extends AppCompatActivity {
    //ArrayList<HashMap<String,Object>> array=new ArrayList<>();
    JSONArray jArray=new JSONArray();
    BookAdapter bookAdapter = new BookAdapter();
    ListView list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_book);

        list=findViewById(R.id.list);
        new KakaoThread().execute();
    }

    //카카오서버 접속을위한 쓰레드
    class KakaoThread extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... strings) {
            String result=Kakao.connect("https://dapi.kakao.com/v3/search/book?target=title&query=자바");
            //데이타파싱
            try {
                jArray = new JSONObject(result).getJSONArray("documents");
                for(int i=0; i<jArray.length(); i++){
                    JSONObject obj=jArray.getJSONObject(i);
                    System.out.println(obj.getString("title") + obj.getString("authors"));
                }
            }catch (Exception e){
                System.out.println("오류:" + e.toString());
            }
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            list.setAdapter(bookAdapter);
        }
    }

    //책어댑터
    public class BookAdapter extends BaseAdapter{
        @Override
        public int getCount() {
            return jArray.length();
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View view, ViewGroup parent) {
            view = getLayoutInflater().inflate(R.layout.item_book, parent, false);
            TextView title=view.findViewById(R.id.title);
            TextView authors=view.findViewById(R.id.authors);
            TextView price=view.findViewById(R.id.price);
            ImageView image=view.findViewById(R.id.image);
            try {
                JSONObject obj = jArray.getJSONObject(position);
                title.setText(obj.getString("title"));
                authors.setText(obj.getString("authors"));
                DecimalFormat df=new DecimalFormat("#,###원");
                price.setText(df.format(obj.getInt("price")));
                if(obj.getString("thumbnail")==null || obj.getString("thumbnail").equals("")){
                    image.setImageResource(R.drawable.ic_launcher_background);
                }else{
                    Picasso.with(BookActivity.this).load(obj.getString("thumbnail")).into(image);
                }
            }catch(Exception e){
                System.out.println("오류:" + e.toString());
            }
            return view;
        }
    }
}

비교필

 

- 이제 검색을 통해서 데이터를 불러오도록 하겠다.

- src/main/res/layout/activity_book.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".BookActivity">
    <EditText
        android:id="@+id/query"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="검색어 입력"
        android:padding="10sp"/>
    <ImageView
        android:id="@+id/search"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@android:drawable/ic_menu_search"
        android:layout_alignParentRight="true"/>
    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/query"/>
</RelativeLayout>

 

- src/main/java/com/example/ex04/BookActivity.java

.....
public class BookActivity extends AppCompatActivity {
    //ArrayList<HashMap<String,Object>> array=new ArrayList<>();
    JSONArray jArray=new JSONArray();
    BookAdapter bookAdapter = new BookAdapter();
    ListView list;

    String query ="파이썬";
    EditText editQuery;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_book);
        getSupportActionBar().setTitle("도서검색");
        list=findViewById(R.id.list);
        new KakaoThread().execute();

        editQuery=findViewById(R.id.query);
        ImageView search = findViewById(R.id.search);
        search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                query = editQuery.getText().toString();
                new KakaoThread().execute();
            }
        });
    }

    //카카오서버 접속을위한 쓰레드
    class KakaoThread extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... strings) {
            String result=Kakao.connect("https://dapi.kakao.com/v3/search/book?target=title&query="+query);
.....

 

확인

 

- 스피너를 이용해 검색 조건을 select 할 수 있도록 하겠다.

- src/main/res/layout/activity_book.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".BookActivity">
    <LinearLayout
        android:id="@+id/linear"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Spinner
            android:id="@+id/spinner"
            android:layout_width="0sp"
            android:layout_height="wrap_content"
            android:layout_weight="2"/>
        <EditText
            android:id="@+id/query"
            android:layout_width="0sp"
            android:layout_height="wrap_content"
            android:hint="검색어 입력"
            android:layout_weight="3"
            android:maxLines="1"
            android:padding="10sp"/>
        <ImageView
            android:id="@+id/search"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/ic_menu_search"
            android:layout_alignParentRight="true"/>
    </LinearLayout>
    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/linear"/>
</RelativeLayout>

 

- src/main/java/com/example/ex04/BookActivity.java

.....
public class BookActivity extends AppCompatActivity {
    //ArrayList<HashMap<String,Object>> array=new ArrayList<>();
    JSONArray jArray=new JSONArray();
    BookAdapter bookAdapter = new BookAdapter();
    ListView list;

    String query ="파이썬";
    EditText editQuery;

    Spinner spinner;
    String target = "title";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_book);
        getSupportActionBar().setTitle("도서검색");
        list=findViewById(R.id.list);
        new KakaoThread().execute();

        editQuery=findViewById(R.id.query);
        ImageView search = findViewById(R.id.search);
        search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                query = editQuery.getText().toString();
                new KakaoThread().execute();
            }
        });

        spinner = findViewById(R.id.spinner);
        String[] items ={"책제목","책저자","출판사"};
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item,items);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                if(i==0){
                    target="title";
                }else if(i==1){
                    target="authors";
                }else if(i==2){
                    target="publisher";
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });
    }

    //카카오서버 접속을위한 쓰레드
    class KakaoThread extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... strings) {
            String result=Kakao.connect("https://dapi.kakao.com/v3/search/book?target="+target+"&query="+query);
            //데이타파싱
.....

 

확인