728x90

이전 코드 구현에서 Gson 라이브러리를 사용하여 코드를 변경하는 부분이 핵심이다.


package com.link2me.android.recyclerviewjava.model

import android.os.Parcelable
import kotlinx.android.parcel.Parcelize

@Parcelize
data class Address_Item (
    // 결과를 받을 모델, 코틀린 혼용하다보니 코틀린의 문법 적용을 받게되어 null 처리를 조심해야 하더라.
    var uid: String="",
    var userNM: String="",
    var mobileNO: String?=null,
    var telNO: String?=null,
    var photo: String?=null,
    var checkBoxState: Boolean
): Parcelable


package com.link2me.android.recyclerviewjava;

import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.widget.CheckBox;
import android.widget.RelativeLayout;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.link2me.android.recyclerviewjava.adapter.RecyclerViewAdapter;
import com.link2me.android.recyclerviewjava.model.Address_Item;
import com.link2me.android.recyclerviewjava.model.DataCommAPI;

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

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;

public class MainActivity extends AppCompatActivity {
    private final String TAG = this.getClass().getSimpleName();
    Context context;

    private ArrayList<Address_Item> addressItemList = new ArrayList<>(); // 서버 원본 데이터 리스트
    private ArrayList<Address_Item> searchItemList = new ArrayList<>(); // 검색한 데이터 리스트
    private RecyclerView mRecyclerView;
    private RecyclerViewAdapter mAdapter;
    private SearchView editsearch;

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

        initView();
    }

    private void initView() {
        // Adapter에 추가 데이터를 저장하기 위한 ArrayList
        getServerData(Value.IPADDRESS+"getJSONData.php"); // 서버 데이터 가져오기
    }

    private void getServerData(String SERVER_URL) {
        HashMap<String, String> params = new HashMap<>();
        params.put("keyword", Value.encrypt(Value.URLkey()));
        JSONObject jsonObject = new JSONObject(params);

        // 1. RequestQueue 생성 및 초기화
        RequestQueue requestQueue = Volley.newRequestQueue(context);

        // 2. Request Obejct인 StringRequest 생성
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, SERVER_URL,jsonObject,
                (Response.Listener<JSONObject>) response -> {
                    Log.e("result", "" + response);
                    try {
                        if(response.getString("status").equals("success")){
                            String jsondata = response.getString("addrinfo");
                            showJSONList(jsondata);
                        } else {
                            showAlert(response.getString("status"),response.getString("message"));
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                },
                error -> Log.d("error", "[" + error.getMessage() + "]")) {

        };

        // 3) 생성한 StringRequest를 RequestQueue에 추가
        requestQueue.add(request);
    }

    private void showJSONList(String JSONdata) {
        try {
            JSONArray peoples = new JSONArray(JSONdata); // [] 대괄호
            addressItemList.clear(); // 서버에서 가져온 데이터 초기화

            Gson gson = new Gson();
            Type listType = new TypeToken<ArrayList<Address_Item>>(){}.getType();
            addressItemList = gson.fromJson(peoples.toString(),listType);
            searchItemList = gson.fromJson(peoples.toString(),listType);

            mRecyclerView = findViewById(R.id.address_listview);
            mAdapter = new RecyclerViewAdapter(context,addressItemList);
            LinearLayoutManager manager = new LinearLayoutManager(context);
            DividerItemDecoration decoration = new DividerItemDecoration(context,manager.getOrientation());

            mRecyclerView.addItemDecoration(decoration);
            mRecyclerView.setLayoutManager(manager);
            mRecyclerView.setAdapter(mAdapter);


        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public void showAlert(String title, String message) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(title);
        builder.setMessage(message)
                .setCancelable(false)
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.dismiss();
                    }
                });
        AlertDialog alert = builder.create();
        alert.show();
    }

    @Override
    public void onBackPressed() {
        backPressHandler.onBackPressed();
    }
}


블로그 이미지

Link2Me

,
728x90

오랫만에 서버에 있는 자료를 가져오는 걸 했는데 삽질을 한참이나 했다.

코틀린으로의 변환을 고려하여 앱 build.gradle은 아래와 같이 작성했다.


앱 build.gradle

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.0"

    defaultConfig {
        applicationId "com.link2me.android.recyclerviewjava"
        minSdkVersion 23
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    compileOptions {
        sourceCompatibility = 1.8
        targetCompatibility = 1.8
    }

}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

    implementation 'com.google.android.material:material:1.1.0'
    implementation 'androidx.cardview:cardview:1.0.0'  // 레이아웃으로 사용할 CardView
    implementation 'androidx.recyclerview:recyclerview:1.1.0'

    implementation 'com.android.volley:volley:1.1.1'
    implementation 'com.google.code.gson:gson:2.8.6'

    // 이미지 출력용 Glide
    implementation 'com.github.bumptech.glide:glide:4.11.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'

}
 


모델 작성

- 코틀린으로 코드를 구현했다. Java 와 코틀린 혼용 코딩이 가능하다.

package com.link2me.android.recyclerviewjava.model

import android.os.Parcelable
import kotlinx.android.parcel.Parcelize

@Parcelize
data class Address_Item (
    // 결과를 받을 모델
    val uid: String="",
    val userNM: String="",
    val mobileNO: String="",
    val telNO: String="",
    val photo: String="",
    val checkBoxState: Boolean
): Parcelable


Gson 라이브러리를 사용했는데도 불구하고, 데이터가 반환되지 않는 원인을 찾고자 Retrofit2 라이브러리 대신에 Volley 라이브러리를 사용해서 테스트 했다. 두 라이브러리는 동시에 사용할 수가 없더라.

그래서 먼저 Gson 라이브러리 사용없이 for문으로 데이터를 저장하는 걸 시도했다.


package com.link2me.android.recyclerviewjava;

import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.widget.CheckBox;
import android.widget.RelativeLayout;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.link2me.android.recyclerviewjava.adapter.RecyclerViewAdapter;
import com.link2me.android.recyclerviewjava.model.Address_Item;

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

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

public class MainActivity extends AppCompatActivity {
    private final String TAG = this.getClass().getSimpleName();
    Context context;

    private ArrayList<Address_Item> addressItemList = new ArrayList<>(); // 서버 원본 데이터 리스트
    private ArrayList<Address_Item> searchItemList = new ArrayList<>(); // 검색한 데이터 리스트
    private RecyclerView mRecyclerView;
    private RecyclerViewAdapter mAdapter;

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

        initView();
    }

    private void initView() {
        // Adapter에 추가 데이터를 저장하기 위한 ArrayList
        getServerData(Value.IPADDRESS+"getJSONData.php"); // 서버 데이터 가져오기
    }

    private void getServerData(String SERVER_URL) {
        HashMap<String, String> params = new HashMap<>();
        params.put("keyword", Value.encrypt(Value.URLkey()));
        JSONObject jsonObject = new JSONObject(params);

        // 1. RequestQueue 생성 및 초기화
        RequestQueue requestQueue = Volley.newRequestQueue(context);

        // 2. Request Obejct인 StringRequest 생성
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, SERVER_URL,jsonObject,
                (Response.Listener<JSONObject>) response -> {
                    Log.e("result", "" + response);
                    try {
                        if(response.getString("status").equals("success")){
                            String jsondata = response.getString("addrinfo");
                            showJSONList(jsondata);
                        } else {
                            showAlert(response.getString("status"),response.getString("message"));
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                },
                error -> Log.d("error", "[" + error.getMessage() + "]")) {

        };

        // 3) 생성한 StringRequest를 RequestQueue에 추가
        requestQueue.add(request);
    }

    private void showJSONList(String JSONdata) {
        try {
            JSONArray peoples = new JSONArray(JSONdata); // [] 대괄호
            addressItemList.clear(); // 서버에서 가져온 데이터 초기화
            for(int i=0;i < peoples.length();i++){
                JSONObject jsonObj = peoples.getJSONObject(i);
                final String uid = jsonObj.getString("uid");
                final String name = jsonObj.getString("userNM");
                final String mobileNO = jsonObj.getString("mobileNO");
                final String telNO = jsonObj.getString("telNO");
                final String photo = jsonObj.getString("photo");

                getServerDataList(uid,name,mobileNO,telNO,photo,false);
                selectDataList(uid,name,mobileNO,telNO,photo,false);
            }

            mRecyclerView = findViewById(R.id.address_listview);
            mAdapter = new RecyclerViewAdapter(context,addressItemList);
            LinearLayoutManager manager = new LinearLayoutManager(context);
            DividerItemDecoration decoration = new DividerItemDecoration(context,manager.getOrientation());

            mRecyclerView.addItemDecoration(decoration);
            mRecyclerView.setLayoutManager(manager);
            mRecyclerView.setAdapter(mAdapter);


        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    // 아이템 데이터 추가를 위한 메소드
    public void getServerDataList(String uid, String name, String mobileNO, String officeNO, String photo_image, boolean checkItem_flag) {
        Address_Item item = new Address_Item(uid,name,mobileNO,officeNO,photo_image,checkItem_flag);
        addressItemList.add(item);
    }

    public void selectDataList(String uid, String name, String mobileNO, String officeNO, String photo_image, boolean checkItem_flag) {
        Address_Item item = new Address_Item(uid,name,mobileNO,officeNO,photo_image,checkItem_flag);
        searchItemList.add(item);
    }

    public void showAlert(String title, String message) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(title);
        builder.setMessage(message)
                .setCancelable(false)
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.dismiss();
                    }
                });
        AlertDialog alert = builder.create();
        alert.show();
    }

}


다른코드는 첨부파일을 참조하면 된다.

recyclerviewj_1.zip


블로그 이미지

Link2Me

,