ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android PHP MySQL 예제 - 데이터베이스에서 데이터를 JSON 형식으로 가져오기
    Android/Android PHP MySQL 예제 2019. 11. 17. 18:42





    안드로이드 앱이  PHP 프로그램을 매개로 하여 MySQL 데이터베이스 서버에 데이터를 JSON 형식으로 가져오는 간단한 예제입니다. 




    1. 웹브라우저로 PHP 동작  테스트


    2. Android 앱에서 테스트


    3. 코드 설명


    4. 관련 포스팅


    5. 참고




    최초 작성 2015. 11. 22

    최종 작성 2019. 11. 17 androidx 사용하도록 변경




    안드로이드 앱이 웹서버에 있는 PHP 파일 실행시키면, PHP 코드는 질의를 하여 MySQL 서버로부터 데이터를 가져옵니다.  

    그리고 나서 데이터를 JSON 포맷으로 가공하여 안드로이드 앱으로 넘겨줍니다. 

    안드로이드 앱은 JSON 포맷의 데이터를 파싱하여 원하는 UI에 데이터를 보기 좋게 보여주게 됩니다. 


    JSON(제이슨, JavaScript Object Notation)은 사람이 읽을 수 있는 텍스트를 사용하여  데이터를 전달할 수 있도록 해주는 개방형 표준 포맷입니다.

    데이터를 키(key)와 값(value)가 쌍을 이루는 형식을 변환하여 사용합니다. 

     


    다음 포스팅에 연결된 포스팅입니다. 



    Android PHP MySQL 예제 - 데이터베이스에 데이터 입력하기

    http://webnautes.tistory.com/828 




     

    1. 웹브라우저로 PHP 동작  테스트

    Android 앱으로 테스트를  진행하기 전에 다음 PHP 코드를  웹 브라우저로 간단한 테스트를 해보겠습니다.



    1-1. 앞에서 진행했던 포스팅의 결과로 현재 testdb 데이터베이스의 person 테이블에  데이터가 저장되어 있는 상태입니다.



    Android PHP MySQL 예제  - 데이터베이스에 데이터 입력하기

    http://webnautes.tistory.com/828




    다음 두 개의 파일이 필요합니다.


    dbcon.php

    MySQL 서버 접속을 위해 사용되는 코드입니다. 위에서 언급한 포스팅에 있습니다. 


    getjson.php

    MySQL에 질의를 보내어 결과를 가져오고 JSON 포맷으로 변환하여 출력하는 역할을 합니다. 


    getjson.php


    <?php

        error_reporting(E_ALL);
        ini_set('display_errors',1);

        include('dbcon.php');
           

        $stmt = $con->prepare('select * from person');
        $stmt->execute();

        if ($stmt->rowCount() > 0)
        {
            $data = array();

            while($row=$stmt->fetch(PDO::FETCH_ASSOC))
            {
                extract($row);
       
                array_push($data,
                    array('id'=>$id,
                    'name'=>$name,
                    'country'=>$country
                ));
            }

            header('Content-Type: application/json; charset=utf8');
            $json = json_encode(array("webnautes"=>$data), JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
            echo $json;
        }

    ?>




    1-2. 윈도우라면 C:\wamp64\www\ 경로에 파일을 생성합니다.



    1-3. 우분투라면 /var/www/html/ 경로에 파일을 생성합니다.



    1-4. 웹브라우저에서 localhost/getjson.php 주소에 접속하면 캡쳐화면처럼 JSON 형식으로 데이터를 보여줍니다. 





    2. Android 앱에서 테스트


    웹서버의 PHP 파일을 매개로하여  데이터베이스의 데이터를 가져오는 안드로이드 앱을 작성합니다.



    2-1. 매니페스트 파일 AndroidManifest.xml의  manifest 태그 하위 항목으로 인터넷 접근 허용 퍼미션을 추가합니다.


    android 9.0 이상에서 동작하게 하려면 usesCleartextTraffic 옵션도 추가해야 합니다. 해주지 않으면 “cleartext http traffic to not permitted” 라는 에러가 발생합니다.  



    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.tistory.webnautes.phptest">

        <uses-permission android:name="android.permission.INTERNET" />

        <application
            android:usesCleartextTraffic="true"
            android:allowBackup="true"




    2-2. 레이아웃 파일 activity_main.xml을 아래 내용으로 대체합니다. 



    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity"
        android:layout_margin="15dp"
        android:padding="10dp">

        <androidx.recyclerview.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="6"
            android:layout_margin="5dp"
            android:padding="5dp"
            android:id="@+id/listView_main_list" />

        <Button
            android:layout_margin="2dp"
            android:id="@+id/button_main_all"
            android:layout_width="match_parent"
            android:layout_weight="2"
            android:layout_height="0dp"
            android:text="전체보기" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="4"
            android:layout_margin="5dp"
            android:padding="5dp"
            android:id="@+id/textView_main_result" />



    </LinearLayout>



    상단의 RecyclerView에는 데이터베이스로부터 가져온 JSON 형식의 데이터를 파싱해서 항목별로 보여줍니다.

    하단의 TextView에는 JSON 형식의 데이터 또는 각종 에러를 보여주는 용도로 사용됩니다. 




    2-3. 레이아웃 파일 item_list.xml을 추가로 생성하여 아래 내용으로 바꿉니다. 



    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:layout_margin="5dp"
        android:padding="5dp">

        <TextView
            android:id="@+id/textView_list_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:padding="5dp" />


        <TextView
            android:id="@+id/textView_list_name"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:padding="5dp" />


        <TextView
            android:id="@+id/textView_list_country"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:padding="5dp" />

    </LinearLayout>



    RecyclerView의 한 줄을 여러 개의 열로 표현하기 위해 필요한 레이아웃입니다.

    필요한 열 개수 만큼 TextView를 추가하고 보여주는 데이터 값에 맞게 크기를 지정해주면 됩니다. 




    2-4. RecyclerView를 사용하려면  build.gradle에 다음 노란줄을 추가해야 합니다. 



    dependencies {

        implementation fileTree(dir: 'libs', include: ['*.jar'])

        implementation 'androidx.appcompat:appcompat:1.0.2'

        implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

        implementation 'androidx.recyclerview:recyclerview:1.0.0'

        testImplementation 'junit:junit:4.12'

        androidTestImplementation 'androidx.test.ext:junit:1.1.0'

        androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'

    }





    2-5. 자바 파일 MainActivity.java을 아래 내용으로 바꿉니다.


    다음 줄에 있는 IP 주소를 아파치 웹서버가 설치된  컴퓨터의 IP로 수정하세요.

    private static String IP_ADDRESS = "IP주소";


    안드로이드 에뮬레이터와 서버가 같은 컴퓨터에 동작하는 경우에는 다음 아이피를 입력합니다.

    Android Studio의 에뮬레이터  - 10.0.2.2

    GenyMotion - 192.168.56.1 


    package com.tistory.webnautes.phptest;

    import android.app.ProgressDialog;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;
    import android.text.method.ScrollingMovementMethod;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;


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

    import java.io.BufferedReader;

    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;

    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.ArrayList;


    public class MainActivity extends AppCompatActivity {

        private static String IP_ADDRESS = "IP주소";
        private static String TAG = "phptest";

        private EditText mEditTextName;
        private EditText mEditTextCountry;
        private TextView mTextViewResult;
        private ArrayList<PersonalData> mArrayList;
        private UsersAdapter mAdapter;
        private RecyclerView mRecyclerView;
        private EditText mEditTextSearchKeyword;
        private String mJsonString;


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

            mTextViewResult = (TextView)findViewById(R.id.textView_main_result);
            mRecyclerView = (RecyclerView) findViewById(R.id.listView_main_list);
            mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

            mTextViewResult.setMovementMethod(new ScrollingMovementMethod());



            mArrayList = new ArrayList<>();

            mAdapter = new UsersAdapter(this, mArrayList);
            mRecyclerView.setAdapter(mAdapter);


            Button button_all = (Button) findViewById(R.id.button_main_all);
            button_all.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {

                    mArrayList.clear();
                    mAdapter.notifyDataSetChanged();

                    GetData task = new GetData();
                    task.execute( "http://" + IP_ADDRESS + "/getjson.php", "");
                }
            });

        }


     
        private class GetData extends AsyncTask<String, Void, String>{

            ProgressDialog progressDialog;
            String errorString = null;

            @Override
            protected void onPreExecute() {
                super.onPreExecute();

                progressDialog = ProgressDialog.show(MainActivity.this,
                        "Please Wait", null, true, true);
            }


            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);

                progressDialog.dismiss();
                mTextViewResult.setText(result);
                Log.d(TAG, "response - " + result);

                if (result == null){

                    mTextViewResult.setText(errorString);
                }
                else {

                    mJsonString = result;
                    showResult();
                }
            }


            @Override
            protected String doInBackground(String... params) {

                String serverURL = params[0];
                String postParameters = params[1];


                try {

                    URL url = new URL(serverURL);
                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();


                    httpURLConnection.setReadTimeout(5000);
                    httpURLConnection.setConnectTimeout(5000);
                    httpURLConnection.setRequestMethod("POST");
                    httpURLConnection.setDoInput(true);
                    httpURLConnection.connect();


                    OutputStream outputStream = httpURLConnection.getOutputStream();
                    outputStream.write(postParameters.getBytes("UTF-8"));
                    outputStream.flush();
                    outputStream.close();


                    int responseStatusCode = httpURLConnection.getResponseCode();
                    Log.d(TAG, "response code - " + responseStatusCode);

                    InputStream inputStream;
                    if(responseStatusCode == HttpURLConnection.HTTP_OK) {
                        inputStream = httpURLConnection.getInputStream();
                    }
                    else{
                        inputStream = httpURLConnection.getErrorStream();
                    }


                    InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
                    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

                    StringBuilder sb = new StringBuilder();
                    String line;

                    while((line = bufferedReader.readLine()) != null){
                        sb.append(line);
                    }

                    bufferedReader.close();

                    return sb.toString().trim();


                } catch (Exception e) {

                    Log.d(TAG, "GetData : Error ", e);
                    errorString = e.toString();

                    return null;
                }

            }
        }


        private void showResult(){

            String TAG_JSON="webnautes";
            String TAG_ID = "id";
            String TAG_NAME = "name";
            String TAG_COUNTRY ="country";


            try {
                JSONObject jsonObject = new JSONObject(mJsonString);
                JSONArray jsonArray = jsonObject.getJSONArray(TAG_JSON);

                for(int i=0;i<jsonArray.length();i++){

                    JSONObject item = jsonArray.getJSONObject(i);

                    String id = item.getString(TAG_ID);
                    String name = item.getString(TAG_NAME);
                    String country = item.getString(TAG_COUNTRY);

                    PersonalData personalData = new PersonalData();

                    personalData.setMember_id(id);
                    personalData.setMember_name(name);
                    personalData.setMember_country(country);

                    mArrayList.add(personalData);
                    mAdapter.notifyDataSetChanged();
                }



            } catch (JSONException e) {

                Log.d(TAG, "showResult : ", e);
            }

        }

    }




    2-6. PersonalData.java 파일을 추가합니다.


    MainActivity와 UsersAdapter에서 사용하는 클래스로 각각 다음 용도로 사용합니다.

    • MainActivity- ArrayList에 데이터를 저장하기 위해 사용됩니다. 

    • UsersAdapter - ArrayList에 있는 데이터를 RecyclerView에 보여줄 때 사용됩니다.


    package com.tistory.webnautes.phptest;


    public class PersonalData {
        private String member_id;
        private String member_name;
        private String member_country;

        public String getMember_id() {
            return member_id;
        }

        public String getMember_name() {
            return member_name;
        }

        public String getMember_country() {
            return member_country;
        }

        public void setMember_id(String member_id) {
            this.member_id = member_id;
        }

        public void setMember_name(String member_name) {
            this.member_name = member_name;
        }

        public void setMember_country(String member_address) {
            this.member_country = member_address;
        }
    }




    2-7. UsersAdapter.java 파일을 추가합니다.

    ArrayList에 있는 PersonalData 타입의 데이터를 RecyclerView에 보여주는 작업을 합니다. 


    package com.tistory.webnautes.phptest;

    import android.app.Activity;
    import androidx.annotation.NonNull;
    import androidx.recyclerview.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;

    import java.util.ArrayList;


    public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.CustomViewHolder> {

        private ArrayList<PersonalData> mList = null;
        private Activity context = null;


        public UsersAdapter(Activity context, ArrayList<PersonalData> list) {
            this.context = context;
            this.mList = list;
        }

        class CustomViewHolder extends RecyclerView.ViewHolder {
            protected TextView id;
            protected TextView name;
            protected TextView country;


            public CustomViewHolder(View view) {
                super(view);
                this.id = (TextView) view.findViewById(R.id.textView_list_id);
                this.name = (TextView) view.findViewById(R.id.textView_list_name);
                this.country = (TextView) view.findViewById(R.id.textView_list_country);
            }
        }


        @Override
        public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_list, null);
            CustomViewHolder viewHolder = new CustomViewHolder(view);

            return viewHolder;
        }

        @Override
        public void onBindViewHolder(@NonNull CustomViewHolder viewholder, int position) {

            viewholder.id.setText(mList.get(position).getMember_id());
            viewholder.name.setText(mList.get(position).getMember_name());
            viewholder.country.setText(mList.get(position).getMember_country());
        }

        @Override
        public int getItemCount() {
            return (null != mList ? mList.size() : 0);
        }

    }




    2-8. 실행결과 입니다.


    상단 RecyclerView는 MySQL에서 가져온 데이터를 파싱해서 리스트 형태로 출력합니다.

    하단 TextView는 파싱 전  JSON 형식의 데이터 또는 에러를 출력합니다.





    3. 코드  설명

    1-1. PersonalData.java 파일에 사용할 데이터가 선언되어 있습니다. 


    public class PersonalData {
        private String member_id;
        private String member_name;
        private String member_country;

    }



    데이터 추가시 클래스의 데이터 저장 및 읽어올때 사용되는 멤버 메소드를 추가하는 방법은 다음 포스팅을 참고하세요.



    Android RecyclerView 간단한 예제

    https://webnautes.tistory.com/1214 





    1-2. UsersAdapter.java 파일에 데이터를 보여주기 위한 처리가 있습니다. 



    레이아웃 파일에 있는 UI 컴포넌트를 CustomViewHolder 클래스의 멤버변수와 연결합니다.

        class CustomViewHolder extends RecyclerView.ViewHolder {
            protected TextView id;
            protected TextView name;
            protected TextView country;


            public CustomViewHolder(View view) {
                super(view);
                this.id = (TextView) view.findViewById(R.id.textView_list_id);
                this.name = (TextView) view.findViewById(R.id.textView_list_name);
                this.country = (TextView) view.findViewById(R.id.textView_list_country);
            }
        }

    onBindViewHolder 호출될때 CustomViewHolder에 데이터를 추가합니다. 

        @Override
        public void onBindViewHolder(@NonNull CustomViewHolder viewholder, int position) {

            viewholder.id.setText(mList.get(position).getMember_id());
            viewholder.name.setText(mList.get(position).getMember_name());
            viewholder.country.setText(mList.get(position).getMember_country());
        }




    3. 버튼을 클릭시 GetData AsyncTask가 실행됩니다. 

    안드로이드 코드에서 실행시킬 서버의 IP_ADDRESS와 PHP 파일 이름을 지정해줍니다. 


    Button button_all = (Button) findViewById(R.id.button_main_all);
    button_all.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {

    mArrayList.clear();
    mAdapter.notifyDataSetChanged();

    GetData task = new GetData();
    task.execute( "http://" + IP_ADDRESS + "/getjson.php", "");
    }
    });

     


     

     4. doInBackground 메소드에서 서버에 있는  PHP 파일을 실행시키고 응답을 저장하고 스트링으로 변환하여  리턴합니다. 

     

    @Override
      protected String doInBackground(String... params) {



    다음 포스팅에서 설명한 부분이라 설명을 생략합니다.  



     Android PHP MySQL 예제 - 데이터베이스에 데이터 입력하기

     http://webnautes.tistory.com/828 



    5. 에러가 있는 경우 에러메시지를 보여주고 아니면 JSON을 파싱하여 화면에 보여주는 showResult 메소드를 호출합니다.


          @Override
    protected void onPostExecute(String result) {
    super.onPostExecute(result);

    progressDialog.dismiss();
    mTextViewResult.setText(result);
    Log.d(TAG, "response - " + result);

    if (result == null){

    mTextViewResult.setText(errorString);
    }
    else {

    mJsonString = result;
    showResult();
    }
    }


    6. 안드로이드 앱에서 받은 JSON 포맷의 데이터입니다.

    간단한 규칙이 있는데 중괄호 {} 는 JSONObject  대괄호 [] JSONArray입니다.


    {
        "webnautes": [
            {
                "id": "1",
                "name": "홍길동",
                "country": "조선"
            },
            {
                "id": "2",
                "name": "잔다르크",
                "country": "프랑스"
            }
        ]
    }


              


    7. 첫번째 괄호는 중괄호 {} 이므로 JSONObject입니다.


    JSONObject jsonObject = new JSONObject(mJsonString);



    8. jsonObject에서 TAG_JSON 키를 갖는 JSONArray를 가져옵니다.


    JSONArray jsonArray = jsonObject.getJSONArray(TAG_JSON);


    이제 다음같은 구조를 jsonArray가 갖고 있게 됩니다. 

    [
            {
                "id": "1",
                "name": "홍길동",
                "country": "조선"
            },
            {
                "id": "2",
                "name": "잔다르크",
                "country": "프랑스"
            }
        ]



    9. JsonArray에는 JSONObject가 데이터 갯수만큼 포함되어 있습니다. 

    인덱스를 사용하여 JsonArray에서 JSONObject를 하나씩 가져옵니다. 

    for(int i=0;i<jsonArray.length();i++){
    JSONObject item = jsonArray.getJSONObject(i);


    10. JSONObject에서 키 id, name, country의 값을 가져옵니다.


    String id = item.getString(TAG_ID);
    String name = item.getString(TAG_NAME);
    String country = item.getString(TAG_COUNTRY);


    11. 데이터를 새로 생성한 PersonalData 클래스의 멤버변수에 입력하고 ArrayList에 추가합니다.

    PersonalData personalData = new PersonalData();

    personalData.setMember_id(id);
    personalData.setMember_name(name);
    personalData.setMember_country(country);

    mArrayList.add(personalData);

    12. 리스트에 데이터가 변경되었음을 알려줍니다. 화면에 추가된 데이터들이 보입니다. 


    mAdapter.notifyDataSetChanged();



    4. 관련 포스팅



    Android PHP MySQL 예제 - 데이터베이스에 데이터 입력하기

    http://webnautes.tistory.com/828 


    Android PHP MySQL 예제 - 데이터베이스 질의(query) 결과 출력하기

    https://webnautes.tistory.com/1159


    Android PHP MySQL 예제  - 데이터베이스에 데이터 저장 및 JSON 형식으로 가져오는 예제 프로젝트

    http://webnautes.tistory.com/1189  





    5. 참고

    [1] http://codeigniter-kr.org/bbs/view/tip?idx=8300


    [2] http://www.simplifiedcoding.net/android-json-parsing-retrieve-from-mysql-database/ 

     

    [3] http://www.simplifiedcoding.net/android-json-tutorial-to-get-data-from-mysql-database/ 



    포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
    댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

    여러분의 응원으로 좋은 컨텐츠가 만들어집니다. 지금 본 내용이 도움이 되었다면 후원 또는 유튜브 구독 부탁드립니다. 감사합니다 : )

    유튜브 구 독 하 기
    후 원 하 기


    댓글 482

    • 이전 댓글 더보기
    • ㅜㅜ 2019.02.12 15:24


      안녕하세요! 포스팅 잘 보고있습니다!
      전체보기 버튼 위쪽에 리스트 부분이 안나오는데요 로그캣에

      Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.View$OnUnhandledKeyEventListener" on path: DexPathList[[zip file "/data/app/com.example.myapplication-WBbnR7v_7JFctFcKSl7PQQ==/base.apk", zip file "/data/app/com.example.myapplication-WBbnR7v_7JFctFcKSl7PQQ==/split_lib_dependencies_apk.apk", zip file "/data/app/com.example.myapplication-WBbnR7v_7JFctFcKSl7PQQ==/split_lib_resources_apk.apk", zip file "/data/app/com.example.myapplication-WBbnR7v_7JFctFcKSl7PQQ==/split_lib_slice_0_apk.apk", zip file "/data/app/com.example.myapplication-WBbnR7v_7JFctFcKSl7PQQ==/split_lib_slice_1_apk.apk", zip file "/data/app/com.example.myapplication-WBbnR7v_7JFctFcKSl7PQQ==/split_lib_slice_2_apk.apk", zip file "/data/app/com.example.myapplication-WBbnR7v_7JFctFcKSl7PQQ==/split_lib_slice_3_apk.apk", zip file "/data/app/com.example.myapplication-WBbnR7v_7JFctFcKSl7PQQ==/split_lib_slice_4_apk.apk", zip file "/data/app/com.example.myapplication-WBbnR7v_7JFctFcKSl7PQQ==/split_lib_slice_5_apk.apk", zip file

      이런게 있더라구요ㅠㅠ 혹시 어떻게 고칠 수 있는지 알 수 있을까요ㅠㅠ

    • sh 2019.03.13 21:23


      getjson.php 를 웹브라우저에서 가져오려고 할때 아래에 팝업창으로 열기/저장이 뜨고 열기를 누르면 비쥬얼스튜디오에서 코드가 열립니다.
      또 다른 문제는 안드로이드에서 가져올때 timeoutexception에러가 뜹니다.
      에러내용)
      java.net.Socket TimeoutException:failed to connect to/ 192.168.1.5(port 80) from / 192.0.0.4 (port 50282)after 5000ms가 전체보기 버튼 밑에 뜹니다..
      뭐가 문젠지 모르겠어요.. 답변 부탁드립니다ㅠㅠ!

    • RYU 2019.03.14 12:38


      안드로이드에서 입려한 정보가 서버의 DB에 일치하지 않으면 '일치하지 않습니다'라는 알림이나 토스트메시지를 띄ㅇ우고 싶은데요
      입력한 정보가 서버의 DB와 일치한다면 DB리스트를 안드로이드 상에 띄우는건 해결했는데
      그 반대의 경우는 서버상의 데이터가 아닌 틀렸다는 정보를 줘야하니깐 이게 어렵네요..
      그래서 서버php코드에서 일치하지 않는 경우에 해당하는 else에는 echo "일치하지 않습니다."라는 코드를 썻는데 이걸 어떻게 안드로이드로 전송하나요?

    • fighting 2019.03.17 11:16


      $sql0="select bustopname from bus where bustop='$clickstop' and bpos='$row['bpos']'";
      $send=mysql_query($sql0);
      header('Content-Type: application/json; charset=utf8');
      $json = json_encode(("webnautes"=>$send), JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
      echo $json;

      배열이 아닌 문자열 변수를 안드로이드에 전달할땐 위에처럼 하면 되나요?

      • fighting 2019.03.17 11:40


        final JSONObject jsonObject = new JSONObject(myJSON);
        jsonObject.getJSONObject(무엇을 넣나요)

        만약 php에서 앞서 말햇듯 문자열 변수를 전달하면 안드로이드에서 getJSONObject에는 어떤걸 넣어야 하나요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.03.17 13:21 신고


        문자열 하나만 받는 거라면 jsonObject.getJSONObject(0)으로 하면 될듯합니다.

    • 2019.03.18 16:21


      안드로이드에서 php로 변수를 전달할 때 php URL주소를 두개로 하는 방법도 있나요?

    • 초보1 2019.03.29 17:09


      질문이 있습니다.
      버튼 안누르고 바로 RecyclerView
      바로 출력하는 형태로 하려면 어떤부분을 건드려야 할까요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.03.29 17:43 신고


        button 이벤트에 있는것을 onCreate 함수로 옮기면 실행하자마자 데이터를 가져올 것입니다.

      • 초보1 2019.04.05 16:21


        감사합니다. 해결되었습니다
        그런데 또 다른 질문이 하나 있는데
        혹시 데이터값들이 정렬이 안된채로 출력 되는데 최신데이터순으로 정렬하는법은 없을까요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.05 16:38 신고


        다음 링크에서 sortData 메소드를 참고하세요..

        https://camposha.info/course/android-recyclerview/lesson/android-recyclerview-sort-ascending-descending/

    • KK 2019.04.06 23:16


      build시 오류는 없고
      핸드폰으로 실행을 하면
      앱이 바로 종료되는데 왜 그럴까요...
      ip나 pjp파일 이름같은 건 맞게 수정했습니다..

    • 2019.04.18 21:33


      비밀댓글입니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.19 11:23 신고


        PHP쪽 로그와 안드로이드 스튜디오의 로그를 둘다 확인하면서 어느쪽에 문제가 있는지 확인해야 할듯합니다.

        서버와 안드로이드 폰이 같은 네트워크(같은 공유기)에 연결되어 있다면 진행에는 별 문제가 없습니다.

        포드 포워딩 문제인지는 간단한 HTML문서를 서버에 생성하여 안드로이드폰의 웹브라우저에서 접속해보면 될듯합니다.

    • 차귀환 2019.05.14 05:43


      2019-05-14 05:40:44.925 10986-10986/com.example.test1 E/AndroidRuntime: FATAL EXCEPTION: main
      Process: com.example.test1, PID: 10986
      java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test1/com.example.test1.SelectActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
      at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
      at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
      at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
      at android.os.Handler.dispatchMessage(Handler.java:106)
      at android.os.Looper.loop(Looper.java:193)
      at android.app.ActivityThread.main(ActivityThread.java:6669)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
      at com.example.test1.SelectActivity.onCreate(SelectActivity.java:62)
      at android.app.Activity.performCreate(Activity.java:7136)
      at android.app.Activity.performCreate(Activity.java:7127)
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)

      이건 무순 애러 인가요 ㅠㅠ 방법좀 알려주세요 !! ㅜ

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.14 10:22 신고


        버튼 리소스를 문제입니다..
        레이아웃 파일에 있는 리소스 이름을 자바코드에 잘못 적어서 발생했을 확률이 높습니다.

        버튼 관련 코드를 자바파일과 리소스 파일에서 검토해보세요.

    • 차귀환 2019.05.14 17:29


      위 애러 작성자 입니다. 저같은 실수를 하실분은 없으시겠지만 엑티비티 명을 바꿔서 실행하다보니 버튼 및 레이아웃 명을 변경해야 했습니다. 그과정속에 바꾸지 못한 곳이 있었으며, 변경을 통해 애러를 해결 하였습니다. 저와 같은 애러를 격으시는 분께 도움이 됬으면 하고, 운영을 하시는 webnautes webnautes선생님 에게도 감사의 인사 드립니다 !! 힘내세요 !♡

    • 코딩이 2019.05.28 15:59


      안녕하세요! 위 포스팅을 잘 따라하며 응용해보는 중입니다. 혹시 getjson.php을 웹에서 실행했을 때 역순으로 (가장 최신db가 위에 오도록)정렬해주려면 php코드에 어떤 부분을 추가해야할까요?

    • dd 2019.06.06 21:26


      위와 같이 해봤는데 NULL POINTER에러가 납니다. 이유를 모르겠어
      E/AndroidRuntime: FATAL EXCEPTION: main
      Process: com.example.securityapp, PID: 7737
      java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.securityapp/com.example.securityapp.getdata}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
      at android.app.ActivityThread.access$800(ActivityThread.java:151)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
      at android.os.Handler.dispatchMessage(Handler.java:102)
      at android.os.Looper.loop(Looper.java:135)
      at android.app.ActivityThread.main(ActivityThread.java:5254)
      at java.lang.reflect.Method.invoke(Native Method)
      at java.lang.reflect.Method.invoke(Method.java:372)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference
      at com.example.securityapp.getdata.onCreate(getdata.java:53)
      at android.app.Activity.performCreate(Activity.java:5990)
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.06 22:01 신고


        activity_main.xml가 다음처럼 구성되어 있나요?

        <LinearLayout>

        <android.support.v7.widget.RecyclerView/>

        </LinearLayout>

      • dd 2019.06.06 22:27


        네ㅜㅜ 위와 똑같이 구성되어 있습니다

      • dd 2019.06.06 22:39


        아 죄송합니다ㅜ 위의 문제는 해결했습니다.
        그러나 전체보기만 나오고 리스트로는 표시되지 않는문제가 있는데 무엇을 확인해 봐야할까요ㅜ 자꾸 물어봐서 죄송합니

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.07 08:56 신고


        3. 코드 설명을 보면서 단계별로 데이터가 잘 이동하는지 테스트해보세요.

      • dd 2019.06.09 13:18


        확인해 봤지만 여전히 뭐가 문젠지 모르겠습니다ㅜㅜ listview는 여전히 나오지 않고 전체보기를 눌렀을 때 전체적인 데이터는 나옵니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.09 15:19 신고


        똑같이 작성해서 동작을 확인한후.. 필요한 부분을 수정해보세요..

    • 2019.06.13 18:03


      비밀댓글입니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.13 18:57 신고


        ArrayList인 mArrayList에 접근하면 됩니다. 다음 글을 참고하세요.

        https://mainia.tistory.com/2323

      • 2019.06.14 21:28


        비밀댓글입니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.14 21:47 신고


        RecyclerView에 대해 공부를 하셔야 수정이 가능합니다.
        포스트의 "3. 코드 설명"을 읽어보면 도움이 될듯합니다.


        아래 세가지 파일에서 각 데이터가 어떻게 배치되는지와

        레이아웃 파일 item_list.xml
        PersonalData.java
        UsersAdapter.java


        MainAcitivity에서 recyclerview를 어떻게 사용하는지 확인해둬야 합니다.

      • 2019.06.25 11:18


        비밀댓글입니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.25 18:35 신고


        httpURLConnection.connect() 때문에 발생한 에러메시지를 구글에서 검색해보면 해결방안을 찾을 수 있습니다.

        최신데이터를 가져오는건 아래 링크를 확인해보세요.
        https://ccollect.tistory.com/28

    • thankyou 2019.06.14 11:46


      안녕하세요 ㅠㅠ 정말 큰 도움 받고 있습니다.
      이전 예제와 지금 예제 같이 프로젝트 생성해서 만들고 있는데 show result 에 이런 에러가 뜨면서
      org.json.JSONException: Value  of type java.lang.String cannot be converted to JSONObject
      화면에 가져온 값들이 보이지 않아요ㅠㅠ
      값은 제대로 가져옵니다. 밑에 뜨거든용ㅠㅠ
      private void showResult(){

      String TAG_JSON="jiyoung";
      String TAG_ID = "id";
      String TAG_NAME = "name";
      String TAG_COUNTRY ="country";


      try {

      JSONObject jsonObject = new JSONObject(mJsonString);<-여기서 에러가 납니다ㅠㅠ
      JSONArray jsonArray = jsonObject.getJSONArray(TAG_JSON);

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.14 12:00 신고


        mJsonString를 출력해보세요. JSON 포멧에서 어긋난 점이 있나봅니다.

      • thankyou 2019.06.14 12:01


        gradle 에 28로 바꾸라고 빨간줄 뜨는데 이거때문일까요??
        implementation 'com.android.support:recyclerview-v7:27.1.1'

        액티비티에서도

        import android.support.v7.app.AppCompatActivity;
        app에만 빨간줄이 뜨네용 ㅠㅠㅠ

      • thankyou 2019.06.14 12:02


        { "jiyoung": [ { "id": "1", "name": "1", "country": "1" }, { "id": "2", "name": "ji", "country": "min" } ]}
        이렇게 출력됩니다ㅠㅠ

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.14 12:08 신고


        27.1.1를 28.0.0으로 바꾸세요.

        혹시 포스팅과 다르게 수정한 부분이 있나요?

      • thankyou 2019.06.14 12:17


        아니욥 방금 다시 만들어서 완전히 다 복붙하고 28.0.0으로도 바꿨는뎅 여전히 같은 라인에서 에러가 떠용 ㅠ
        at com.example.servertest2.MainActivity.showResult(MainActivity.java:191)
        at com.example.servertest2.MainActivity.access$700(MainActivity.java:33)
        at com.example.servertest2.MainActivity$GetData.onPostExecute(MainActivity.java:112)
        at com.example.servertest2.MainActivity$GetData.onPostExecute(MainActivity.java:83)

      • thankyou 2019.06.14 12:25


        하나 바꾼게 있다면 insert.php

        if( (($_SERVER['REQUEST_METHOD'] == 'POST') || $android )
        {
        이렇게 바꿨어요

      • thankyou 2019.06.14 13:30


        혹시 TAG_JSON 값이 어떤거여야하나요??? getjson.php 에서두요!!

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.14 16:49 신고


        php 파일의 다음 부분에 적은 문자열과

        {
        "webnautes": [


        자바 코드의 TAG_JSON에 적은 문자열이 같아야 합니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.14 17:08 신고


        안드로이드 코드 문제가 아니라 PHP 코드에서 넘겨주는 JSON에 문제가 있는 듯합니다.

      • Thankyou 2019.06.14 17:23


        번거롭게 해서 죄송합니다ㅠㅠ이부분 말씀하시는거라면 새로 만든 프로젝트에서는 다 동일하게
        Php와 자바 코드 모두 webnautes로 통일했습니다 sqlite 유저네임만 다릅니다
        $json = json_encode(array("webnautes"=>$data), JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
        echo $json;

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.14 17:34 신고


        혹시 JSON 앞쪽이나 뒤쪽에 쓰레기 값이 포함되진 않았는지 체크해보세요.

      • thankyou 2019.06.14 18:33


        log 에 뜬 json 을 복사해봤는데 \ 외에 맨앞쪽 쓰레기값인가요?
        " \uFEFF\uFEFF{ \"webnautes\": [ { \"id\": \"1\", \"name\": \"1\", \"country\": \"1\" }, { \"id\": \"2\", \"name\": \"ji\", \"country\": \"min\" } ]}"

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.14 20:04 신고


        유니코드 (Unicode) 의 BOM (Byte Order Mark)때문이라고 합니다.

        다음 링크의 코드를 사용하면 제거해보세요..

        https://stackoverflow.com/a/15423899

    • Favicon of http://todolist.dothome.co.kr BlogIcon 질문이요 2019.06.21 20:40


      http://todolist.dothome.co.kr/getjson.php 라고입력했더니
      todolist.dothome.co.kr의 getjson.php(131바이트)를 열거나 저장하시겠습니까 라고 뜨네요,,왜이래요?!

    • jjj 2019.07.28 11:52


      안드로이드 폰의 웹브라우저에서 php파일이 잘 실행되고 안드로이드 에뮬레이터에서 앱도 잘 실행되는데요, 모바일에서 앱을 실행하면 리스트 뷰에 아무것도 보이지 않습니다ㅠㅠ 어느부분을 확인해보아야할까요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.28 13:44 신고


        혹시 사용중인 안드로이드 SDK가 android 28(Q)인가요?

        인터넷 접근 권한을 외에 추가적으로 처리해줘야 해당 권한을 사용할 수 있도록 바뀌었습니다.


        다음 링크대로 추가해보세요.

        https://voopro.blogspot.com/2018/11/android.html

        위 링크대로 수정후 왜그런지는 모르겠지만..
        에뮬레이터에서는 동작안하는데
        안드로이드폰에서는 동작합니다.

      • jjj 2019.07.29 18:41


        알려주신 방법으로 하니 해결되었습니다ㅠㅠ 항상감사합니다!!!:)

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.29 19:08 신고


        해결되서 다행입니다 : )

    • 좋은글감사합니다. 2019.08.16 13:05


      위의 코드로 PHPTEST라는 어플을 만들고, 전체보기를 누르면 DB에서 데이터를 가져오는데

      그러면 "전체보기"를 누를때마다 DB에 연결되는건가요? 아니면 처음눌럿을때 연결이 계속 유지되어있는건가요? 제가볼땐 "전체보기"를 누를때마다 DB에 새로 연결되는거같은데.. 맞나요?

    • ㅈㅇㅅ 2019.10.30 15:10


      관리자님 궁금한게 있어서 여쭤봅니다. 안드로이드에 데이터를 저장하는 강좌와 불러오는강좌, 그리고 이 둘을 합친강좌가 전부 따로 존재하던데요. 합쳐져있는 한개의 강의와 따로 분리된 두개의 강의에서 차이점이 있나요??

    • ㅈㅅ 2019.11.09 16:35


      알기 쉬운 정보 정말 감사합니다!!!
      근데 코드 실행 중에 DB구성 부분만 추가/수정하고 나머지는 모두 게시글과 같게 구성하였는데, 오류가 발생했는데 해결방법을 잘 모르겠어서 글을 남기게 되었습니다 ㅠㅠ

      org.json.JSONException: Value  of type java.lang.String cannot be converted to JSONObject 라는 오류가 뜹니다.

      JSONObject jsonObject = new JSONObject(mJsonString); 해당 소스에서 생기는 오류임을 확인할 수 있었고,
      mJsonString={ "webnautes": [ { "id": "1", "name": "ㅇㅇ", "region": "ㅇㅇ", "address": "ㅇㅇ", "phone": "15" }]} 입니다.

      아무리 찾아봐도 잘 모르겠어서 ㅠㅠ 어떻게 다가가야 해결할 수 있을까요? 감사합니다 ㅠㅠㅠ :)

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.09 17:06 신고


        다음 포스팅의 2-4부터 봐보세요..

        https://webnautes.tistory.com/471

      • ㅈㅅ 2019.11.10 12:10


        2-4. JSONObject 가져와야하는 부분을 말씀해주신거죠?!?

        mJsonString = mJsonString.replaceAll(" ", "");
        JSONObject jsonObject = new JSONObject(mJsonString);
        JSONArray jsonArray = jsonObject.getJSONArray(TAG_JSON);

        안내해주신 포스트를 봤지만 ㅠㅠ 코드의 어떤 부분을 수정해야할지 잘 모르겠습니다..ㅠㅠㅠㅠ

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.10 15:42 신고


        2.4부터 보여주는 JSON RAW 문자열과 코드를 같이보며 이해해야합니다.

        예를 들어 2-4에서는 JSONObject를 가져오기 위해 빨간색으로 표시된 photos를 지정해주면 photos에 파란색 부분들이 저장됩니다.

      • 2019.11.12 17:16


        비밀댓글입니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.12 23:12 신고


        PHP로부터 받아온 JSON 데이터에 잘못된 값이 추가로 들어가 있는건 아닌지 학인해보세요...

        본 포스트의 코드대로 해서 동작을 확인한 다음 코드를 다시 수정해보는 것도 좋을 듯합니다.

    • IOT 2019.11.14 01:35


      getjson.php 파일에서
      array_push($data,
      array('id'=>$id,
      'name'=>$name,
      'country'=>$country
      ));
      이 부분을 어떻게 고쳐야 할 지 모르겠습니다.
      제가 불러오고자하는 테이블은 time 과 data를 출력해야하는데
      그래서
      'time' =>$time
      'data' =>$data 라고 고치니
      <br />
      <b>Warning</b>: array_push() expects parameter 1 to be array, string given in <b>/var/www/html/getjson.php</b> on line <b>21</b><br />
      <br />
      <b>Warning</b>: array_push() expects parameter 1 to be array, string given in <b>/var/www/html/getjson.php</b> on line <b>21</b><br />
      <br />
      <b>Warning</b>: array_push() expects parameter 1 to be array, string given in <b>/var/www/html/getjson.php</b> on line <b>21</b><br />
      <br />
      <b>Warning</b>: array_push() expects parameter 1 to be array, string given in <b>/var/www/html/getjson.php</b> on line <b>21</b><br />
      <br />
      <b>Warning</b>: array_push() expects parameter 1 to be array, string given in <b>/var/www/html/getjson.php</b> on line <b>21</b><br />
      <br />
      <b>Warning</b>: array_push() expects parameter 1 to be array, string given in <b>/var/www/html/getjson.php</b> on line <b>21</b><br />
      <br />
      <b>Warning</b>: array_push() expects parameter 1 to be array, string given in <b>/var/www/html/getjson.php</b> on line <b>21</b><br />
      <br />
      <b>Warning</b>: array_push() expects parameter 1 to be array, string given in <b>/var/www/html/getjson.php</b> on line <b>21</b><br />
      {
      "phpmyadmin": "0"
      }
      오류가뜨면서 데이터를 불러오지 못합니다 어떻게 고쳐야하나요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.14 09:49 신고


        앞에서 $data를 사용중인데 country를 $data라 바꾸어서 에러난듯합니다.
        $data 이름을 다른 것으로 변경하고

        array_push($data,
        array('id'=>$id,
        'name'=>$name,
        'country'=>$country
        ));


        아래 코드에서 $data도 앞에서 바꾼 이름으로 변경하세요.

        $json = json_encode(array("webnautes"=>$data), JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);

      • IOT 2019.11.14 10:16


        네 알겠습니다ㅎㅎ
        그리고
        implementation 'com.android.support:recyclerview-v7:27.1.1'여기서 자꾸 오류가 나는데 다른 버전을 써야하는건가요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.14 22:14 신고


        아 amdroidx를 사용하는데 리싸이클러뷰만 android.support라서 발생한 문제입니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.14 22:17 신고


        implementation 'androidx.recyclerview:recyclerview:1.1.0'

        를 사용하세요

      • IOT 2019.11.14 23:19


        혹시 안드로이드 스튜디오 버전을 몇으로 사용하셨나요 안되는 import가 많네요ㅠㅠ

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.15 09:39 신고


        androidx를 사용하기 전 코드입니다.

        패키지 이름이 다 바뀐거 빼고는 똑같습니다.

        수정해야 겠군요..

      • IOT 2019.11.20 17:08


        전체보기를 클릭하는 화면을 제외하고 메인 화면에만 출력할려면 어떤 activity만 있으면 되나요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.21 08:30 신고


        포스트에 있는 코드 모두 필요합니다

      • IOT 2019.11.21 23:44


        import android.support.v7.app.AppCompatActivity;
        import android.support.v7.widget.RecyclerView;
        이 두개 import는 반드시 있어야하나요 이게 자꾸 에러가 뜨고 고치는 방법이 잘 없는 것 같습니다.ㅠㅠ 저거 빼고 컴파일해서 그런지 앱 실행도 안됩니다ㅠㅠ

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.22 08:35 신고


        최근에 포스트가 androidx를 사용하도록 수정되었습니다.

        포스트에 있는 코드를 복사하여 다시 테스트해보세요.

Designed by Tistory.