반응형





안드로이드 앱이  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/ 



반응형

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

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

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요.

  1. 이전 댓글 더보기
  2. ㅈㅅ 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 데이터에 잘못된 값이 추가로 들어가 있는건 아닌지 학인해보세요...

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

  3. 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를 사용하도록 수정되었습니다.

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

  4. 초보 2020.03.29 00:16

    안녕하세요 안드로이드 프로젝트 중 디비값을 어떻게 가져오는 지 고민하고 있었는데 글을 보고 정말 잘 적용하고 있습니다. 귀한 글 진심으로 감사합니다...!

  5. ㅎㄹ 2020.04.06 19:04

    안녕하세요
    얼추 다 만들어 놨는데 하단 TextView는 뜨고 상단의 리스트 형태는 안뜨는데 이유가 뭘까요..?


  6. ㅎㄹ 2020.04.07 00:17

    로그캣 중에서 이 줄만 빨간 줄로 떴는데 어떤 오류인지 아시나요..?

    2020-04-07 00:15:10.201 2635-2688/com.example.review E/eglCodecCommon: GoldfishAddressSpaceHostMemoryAllocator: ioctl_ping failed for device_type=5, ret=-1

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.04.07 10:29 신고

      알려주신 다음 에러말고 다른 메시지는 없나 확인해보세요.. 너무 정보가 적어서 어떤 에러인지 알기 힘드네요.

  7. ㅎㄹ 2020.04.07 21:33

    2020-04-07 00:15:08.710 2635-2635/com.example.review I/.example.revie: Not late-enabling -Xcheck:jni (already on)
    2020-04-07 00:15:08.914 2635-2635/com.example.review W/.example.revie: Unexpected CPU variant for X86 using defaults: x86
    2020-04-07 00:15:09.490 2635-2635/com.example.review W/.example.revie: Accessing hidden method Landroid/graphics/drawable/Drawable;->getOpticalInsets()Landroid/graphics/Insets; (light greylist, linking)
    2020-04-07 00:15:09.490 2635-2635/com.example.review W/.example.revie: Accessing hidden field Landroid/graphics/Insets;->left:I (light greylist, linking)
    2020-04-07 00:15:09.490 2635-2635/com.example.review W/.example.revie: Accessing hidden field Landroid/graphics/Insets;->right:I (light greylist, linking)
    2020-04-07 00:15:09.490 2635-2635/com.example.review W/.example.revie: Accessing hidden field Landroid/graphics/Insets;->top:I (light greylist, linking)
    2020-04-07 00:15:09.490 2635-2635/com.example.review W/.example.revie: Accessing hidden field Landroid/graphics/Insets;->bottom:I (light greylist, linking)
    2020-04-07 00:15:09.645 2635-2635/com.example.review W/.example.revie: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (light greylist, reflection)
    2020-04-07 00:15:09.645 2635-2635/com.example.review W/.example.revie: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (light greylist, reflection)
    2020-04-07 00:15:09.649 2635-2635/com.example.review W/.example.revie: Accessing hidden method Landroid/widget/TextView;->getTextDirectionHeuristic()Landroid/text/TextDirectionHeuristic; (light greylist, linking)
    2020-04-07 00:15:09.823 2635-2635/com.example.review D/OpenGLRenderer: HWUI GL Pipeline
    2020-04-07 00:15:10.102 2635-2688/com.example.review D/HostConnection: HostConnection::get() New Host Connection established 0xe5796e50, tid 2688
    2020-04-07 00:15:10.111 2635-2688/com.example.review D/HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_dma_v1 ANDROID_EMU_YUV420_888_to_NV21 ANDROID_EMU_YUV_Cache ANDROID_EMU_async_unmap_buffer GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_gles_max_version_2
    2020-04-07 00:15:10.140 2635-2688/com.example.review I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
    2020-04-07 00:15:10.141 2635-2688/com.example.review I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0
    2020-04-07 00:15:10.141 2635-2688/com.example.review I/OpenGLRenderer: Initialized EGL, version 1.4
    2020-04-07 00:15:10.141 2635-2688/com.example.review D/OpenGLRenderer: Swap behavior 1
    2020-04-07 00:15:10.141 2635-2688/com.example.review W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
    2020-04-07 00:15:10.141 2635-2688/com.example.review D/OpenGLRenderer: Swap behavior 0
    2020-04-07 00:15:10.148 2635-2688/com.example.review D/eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 0 0
    2020-04-07 00:15:10.148 2635-2688/com.example.review D/EGL_emulation: eglCreateContext: 0xe57ee3c0: maj 2 min 0 rcv 2
    2020-04-07 00:15:10.190 2635-2688/com.example.review D/EGL_emulation: eglMakeCurrent: 0xe57ee3c0: ver 2 0 (tinfo 0xe91076d0)
    2020-04-07 00:15:10.197 2635-2688/com.example.review D/HostConnection: createUnique: call
    2020-04-07 00:15:10.197 2635-2688/com.example.review D/HostConnection: HostConnection::get() New Host Connection established 0xe5798e80, tid 2688
    2020-04-07 00:15:10.201 2635-2688/com.example.review D/HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_dma_v1 ANDROID_EMU_YUV420_888_to_NV21 ANDROID_EMU_YUV_Cache ANDROID_EMU_async_unmap_buffer GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_gles_max_version_2
    2020-04-07 00:15:10.201 2635-2688/com.example.review E/eglCodecCommon: GoldfishAddressSpaceHostMemoryAllocator: ioctl_ping failed for device_type=5, ret=-1
    2020-04-07 00:15:10.213 2635-2688/com.example.review D/EGL_emulation: eglMakeCurrent: 0xe57ee3c0: ver 2 0 (tinfo 0xe91076d0)
    2020-04-07 00:15:11.983 2635-2790/com.example.review D/NetworkSecurityConfig: No Network Security Config specified, using platform default
    2020-04-07 00:15:12.200 2635-2688/com.example.review D/EGL_emulation: eglMakeCurrent: 0xe57ee3c0: ver 2 0 (tinfo 0xe91076d0)
    2020-04-07 00:15:12.278 2635-2688/com.example.review D/EGL_emulation: eglMakeCurrent: 0xe57ee3c0: ver 2 0 (tinfo 0xe91076d0)
    2020-04-07 00:15:12.304 2635-2688/com.example.review D/EGL_emulation: eglMakeCurrent: 0xe57ee3c0: ver 2 0 (tinfo 0xe91076d0)
    2020-04-07 00:15:13.673 2635-2790/com.example.review D/foodchemii24: response code - 200
    2020-04-07 00:15:14.019 2635-2688/com.example.review D/EGL_emulation: eglMakeCurrent: 0xe57ee3c0: ver 2 0 (tinfo 0xe91076d0)
    2020-04-07 00:15:14.046 2635-2635/com.example.review D/foodchemii24: response - { "LIEYUJIN": [ { "user_id": "", "content": "", "grade": "0", "date": "0000-00-00" }, { "user_id": "harim", "content": "존맛", "grade": "10", "date": "0000-00-00" }, { "user_id": "mj", "content": "노맛", "grade": "1", "date": "0000-00-00" } ]}
    2020-04-07 00:15:14.048 2635-2635/com.example.review D/foodchemii24: showResult :
    org.json.JSONException: No value for webnautes
    at org.json.JSONObject.get(JSONObject.java:392)
    at org.json.JSONObject.getJSONArray(JSONObject.java:587)
    at com.example.review.MainActivity.showResult(MainActivity.java:192)
    at com.example.review.MainActivity.access$700(MainActivity.java:32)
    at com.example.review.MainActivity$GetData.onPostExecute(MainActivity.java:111)
    at com.example.review.MainActivity$GetData.onPostExecute(MainActivity.java:82)
    at android.os.AsyncTask.finish(AsyncTask.java:695)
    at android.os.AsyncTask.access$600(AsyncTask.java:180)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:712)
    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)
    2020-04-07 00:15:14.049 2635-2688/com.example.review D/EGL_emulation: eglMakeCurrent: 0xe57ee3c0: ver 2 0 (tinfo 0xe91076d0)
    a

    이게 로그캣전부에요ㅠ 너무긴가요...

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

      답변이 늦었네요.

      자바 코드에서 아래 부분의 webnautes를 LIEYUJIN로 변경해보세요.

      String TAG_JSON="webnautes";

    • ㅎㄹ 2020.04.12 16:08

      감사합니다!! ㅠㅠㅠㅠ

  8. ㅎㄹ 2020.04.08 20:41

    혹시답변이어려우신가요..ㅠ

  9. zdzd 2020.04.09 13:17

    저는 페이지 넘어가고 나서 버튼 누르면 뜨게 했는데
    페이지 넘어가면서 버튼눌러서 말고 바로 뜨게 하는법 있을가요??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.04.09 14:21 신고

      onClick 메소드 내용을 복사하여 onStart 메소드에 붙여넣기 하세요

    • zdzd 2020.04.16 12:40

      해결했씁니다 감사합니당

  10. hoxy 2020.04.23 21:34

    데이터베이스에 접근해서 데이터를 가져오는 것은 성공하였으나 다른 궁금점이 있어 문의드립니다.

    올려주신 자료를 가지고 응용을 하여

    검색창에 "홍" 을 입력하고 완료를 누르면 데이터베이스에 연결되어
    홍길동의 시험성적과 증명사진을 불러오는 것까지 성공하였습니다.

    해보고 싶은 건 홍길동의 시험성적보다 높은 사람들을
    동시에 띄워주고 싶은데 이런 게 가능할까요 ?

    데이터베이스에 한번 접근할 때 / "홍"이 홍길동이라는 걸 확인하면 홍길동의 데이터를 빼오고, 홍길동보다 시험성적이 높은 애들을
    파악해 보여줘야하는데
    이걸 한번에 수행하는 게 가능한지 의문이 들더라고요 ,,

    시험성적을 받아올 땐 getString 으로 받아와 문자열이 되어 int 형으로 반환도 해보고 했는데 잘모르겠네요 ㅜㅜ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.04.23 22:00 신고

      php에서 홍길동의 점수를 질의하는 sql문을 실행하고..

      이후 홍길동보다 시험 성적이 높은 사람을 찾는 질의를 해서 결과를 리턴해주면 될듯합니다.

    • hoxy 2020.04.23 22:44

      그럼 홍길동의 데이터를 불러오는 php 안에 추가해줘야 하는 건가요 ?

      아님 따로 질의하는 php 파일을 만들고 동일한 activity 안에 두개의 파일을 json 해야 하나요 ?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.04.23 22:47 신고

      php에 홍길동 이름만 넘겨주면 php에서 처리후 홍길동보다 점수 높은 사람만 안드로이드로 리턴해주면 될듯합니다.

    • hoxy 2020.04.24 18:08

      <?php

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

      include('dbcon.php');

      $name=isset($_POST['name']) ? $_POST['name'] : '';
      $android = strpos($_SERVER['HTTP_USER_AGENT'], "Android");

      // ------- 변수 선언
      $name2;
      $score2;
      $hobby2;
      $studytime2;
      $shcool2;


      if ($name != "" ){

      $sql="select * from student where name='$name'";
      $stmt = $con->prepare($sql);
      $stmt->execute();

      if ($stmt->rowCount() == 0){ // 만약 이름 db 안에 존재하지 않는다면

      echo "'";
      echo $name;
      echo "'은 찾을 수 없습니다.";
      }

      else{ //이름이 db 안에 존재한다면
      $data = array();

      while($row=$stmt->fetch(PDO::FETCH_ASSOC)){

      extract($row);

      array_push($data, //array에 name에 걸린 db정보 던져줌
      array(
      'score'=>$score,
      'hobby'=>$hobby,
      'sutudytime'=>$sutudytime,
      'school'=>$school
      ));
      }

      fulldata(); // 모든 테이블 db 불러오는 함수 호출.

      if($score<$score2&&$studytime<$studytime2){ // 성적 비교해야됨. 이게 맞나 ,,, ??
      $sql3 = "select * from student where name=?";
      $stmt3 = $con3->prepare($sql3);
      $stmt3->bind_param("s",$name2);
      $stmt3->execute();

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


      }

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

      }


      // 전체 데이터베이스 불러오는 함수!
      function fulldata () {
      global $name2,$score2, $studytime2, $hobby2, $school2; // 전역변수 받아옴

      $sql2 = "select * from student";
      $stmt2 = $con2->prepare($sql2);
      $stmt2->execute();

      if ($stmt2->rowCount() > 0)
      {
      $data2 = array();

      while($row=$stmt2->fetch(PDO::FETCH_ASSOC))
      {
      extract($row);

      array_push($data2,
      array(
      'name'=>$name2,
      'score'=>$score2,
      'studytime'=>$studytime2,
      'hobby'=>$hobby2,
      'school'=>$school2
      ));
      }
      header('Content-Type: application/json; charset=utf8');
      $json2 = json_encode(array("webnautes"=>$data2), JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
      echo $json2;
      }
      return $data2 ;
      }

      ?>


      이런식으로 만들어봤는데 이렇게 접근하는 게 맞나요 ,, ?

  11. 도와주세요 2020.05.14 01:15

    전체보기눌렀을때 목록나타나잖아요
    처음부터 목록나오게하려면 어떻게해야하나요??
    전체보기버튼 없애려구요..nn

    • 도와주세요 2020.05.14 01:24

      아 해결한거같아요 그냥 전체보기 함수를 제거하면되네요.,

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.05.14 07:51 신고

      다행입니다~

  12. 앱린이 2020.05.17 20:14

    안녕하세요. 친구와 졸업작품을 하고 있는데 많은 도움이 됩니다. 감사합니다. 본문의 글 대로 똑같이 따라하였는데 앱을 실행하니 밑에 textview 부분에 the requested URL was not found on this server. 라고 에러가 나옵니다! 서버는 친구가 만든 서버에서 작업하였는데 제 노트북에서 테스트해서 문제인건가요??ㅜ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.05.17 20:44 신고

      서버와 안드로이드폰이 같은 네트워크에 있거나 안드로이드폰에서 서버에 접근할 수 있어야합니다

  13. 응팔 2020.05.23 16:17

    안녕하세요! 저는 1번 홍길동과 2번 잔다르크 사이를 구분할 수 있는 선이 있었으면 좋겠어서 recycleview 말고 그냥 listview로 바꿔서했는데 앱이 종료되요ㅠㅠlayout에서 listview로 바꾸면 코드도 바꿔야하나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.05.23 16:19 신고

      네..바꾸면 코드도 바꿔야합니다. 구분선 넣는 방법만 적용해보세요.

      아래 링크 참고하세요
      https://chebaum.tistory.com/10

    • 응팔 2020.05.23 16:26

      아 넵! 감사합니다.

  14. ILLHYHL 2020.06.17 15:39

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

    이곳에서 전혀 RecyclerView 에 표시가 되지 않습니다. 에러조차 뜨지 않아서 찾질 못하고있습니다.
    적어주신 코드를 모두 직접 적어보기도 하고 복붙도 해보고 다 해봤지만 똑같은 결과만 나왔습니다.

    그런데 전체보기를 눌렀을때
    Run 에서
    D/phptest: response code - 200
    D/EGL_emulation: eglMakeCurrent: 0xf4d717f0: ver 3 0 (tinfo 0xf4df9010)
    D/EGL_emulation: eglMakeCurrent: 0xf4d717f0: ver 3 0 (tinfo 0xf4df9010)
    D/phptest: response - { "dustData": [ { "id": "571", "main_no": "3", "humi": "3", "temp": "3", "dust": "3", "dustmin": "3", "tvoc": "3", "co2": "3", "co": "3", "ch2o": "3", "pm1": "3", "regdate": "2020-06-16 17:41:51" } ]}
    D/phptest: showResult :
    org.json.JSONException: No value for webnautes
    at org.json.JSONObject.get(JSONObject.java:400)
    at org.json.JSONObject.getJSONArray(JSONObject.java:595)
    at com.example.db.MainActivity.showResult(MainActivity.java:185)
    at com.example.db.MainActivity.access$700(MainActivity.java:29)
    at com.example.db.MainActivity$GetData.onPostExecute(MainActivity.java:105)
    at com.example.db.MainActivity$GetData.onPostExecute(MainActivity.java:76)
    at android.os.AsyncTask.finish(AsyncTask.java:771)
    at android.os.AsyncTask.access$900(AsyncTask.java:199)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:788)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:216)
    at android.app.ActivityThread.main(ActivityThread.java:7464)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:955)

    이러한 코드가 발생하였습니다. 어느 부분을 먼저 확인하고 무엇을 변경해야 하나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.06.17 17:37 신고

      포스트에는 JSON에 webnautes라 되어있는데 생성하신 JSON에는 dustData로 되어있습니다. 자바코드에서 webnautes라 된부분을 dustData로 변경하면 될 듯합니다

  15. oo 2020.06.18 01:55

    mAdapter = new UsersAdapter(this, mArrayList);

    PersonalData personalData = new PersonalData();

    이 부분에서 Type parameter cannot be instantiated dilectly 라며 빨간줄이 생깁니다.
    어떻게 해결해야 할까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.06.18 08:15 신고

      포스트와 다르게 수정한 부분이 있나요?

    • oo 2020.06.18 08:36

      다른 데이터베이스 테이블을 사용하여서 변수와 메서드 이름들을 변경하였습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.06.18 08:53 신고

      포스트 기존 코드와 수정한 부분을 비교해보며 원인을 찾아야 할거 같습니다.

  16. ILLHYHL 2020.06.22 15:42

    RecyclerView 를 사용할때 개수를 하나만 출력이 되도록 하려면 getItemCount() 에서 어떻게 바꿔야 하나요?

  17. ILLHYHL 2020.06.22 16:53

    sql 문은 전혀 생각하지 않았습니다. 6개월 교육받은 신입개발자인데... 정말 감사합니다. 좋은 자료 올려주셔서 감사합니다.

  18. ILLHYHL 2020.06.23 16:54

    RecyclerVeiw의 데이터들이 Activity 에 표시됩니다. 그런데 그중에 한 데이터를 TextView 로 가져와서 같은 Activity에 띄우고 싶은데 방법을 찾다가 다시 여기에 문의 납깁니다. 가능할까요?

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

      mArrayList에서 원하는 데이터 하나를 가져오면 될듯합니다. RecyclerView에서 특정 데이터를 터치하면 TextView에 보여주려는 건가요?

    • ILLHYHL 2020.06.24 09:36

      ArrayList 에서 특정 데이터를 하나 가지고 오면 되는군요. 계속 시도 해보고 안되면 그때 다시 문의하겠습니다.
      RecyclerView에서 터치 안하고 MainActivity가 화면에 띄워지면 바로 보이도록 표시하려고 합니다.
      데이터를 표시해 주는건 어떤 코드를 사용해도 상관없습니다. TextView,ListView,RecyclerView 등등 어떤 것이든 상관없이 그 데이터 딱 하나만 표시가 되도록 하려고 합니다. Adapter 로 다시 딱 하나의 데이터만 넣어서 해보려고 했더니 코드가 너무 커지고 해서 다른 방법을 찾아보고 있습니다.

      결론은 RecyclerView 에서 표시되는 데이터 하나만 TextVIew 나 ListView 로 가져와서 하나의 Activity 에서 RecyclerView 와 TextView/ListView 띄우기 입니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.06.24 13:40 신고

      sql문에 LIMIT 1을 추가하여 하나만 데이터베이스에서 가져오는게 나을거 같군요

    • ILLHYHL 2020.06.24 14:01

      php 파일에서 select dust from dust_tbl limit 1 을 추가해서 하게 되면 Adapter 도 다시 생성해서 만들어야하지 않나요? android Activity 에서 띄워진 걸 가지고 오는건 할 수 없는건가요? getjson.php 파일을 하나더 만들어서 사용해야하나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.06.24 14:06 신고

      기존에 PHP로 가져온거는 그대로 보여주고 따로 하나만 또 보여주는 거라면 ArrayList에서 특정번째 데이터를 가져올 수 밖에 없습니다

    • ILLHYHL 2020.06.24 17:23

      ArrayList.get(특정데이터) 불러와서 TextView에 띄우려고 하니 안되고 RecyelerView 에서 가능하지만 특정값은 나오지만 그 외 다른 값들은 null 로 표시가 되서 나옵니다. 결국 찾지 못하고 다시 문의하게 되었습니다. 조금에 팁좀 알려주실수 있나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.06.24 18:30 신고

      어떤 기준으로 하나를 선택하는 지 알수 없어 답변하기 애매하군요.

      showResult()에서 하나를 선택하여 원하는 곳에 보여줘도 될듯합니다

    • ILLHYHL 2020.06.25 13:03

      9개의 데이터중에 하나만 가져오도록 해보왔습니다.

      Data Data1 = new Data();

      Data1.set특정데이터(특정데이터);

      ArrayList.add(Data1);
      Adapter.notifyDataSetChanged();


      이런식으로 딱 하나만 가져와서 RecyclerView 로 추가 했더니 nul null null 특정데이터 null null null null 이런식으로 Activity에 표시가 되었습니다.

      분명하나만 가져왔는데 다른 데이터까지 들어와서 이걸 해결 하고 있습니다.

      문제가 뭘까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.06.25 19:10 신고

      우선 텍스트뷰에 출력해보세요. RecyclerView에 출력하려면 확인해야 할게 많습니다

    • ILLHYHL 2020.06.26 16:16

      TextView 로는 가져오기가 안되서 결국 Adapter 에 하나의 데이터만 넣어서 가지고 오니 됐습니다. 계속 개발을 하면서 발전해나가도록 해봐야죠 ㅠㅠ
      이제는 특정데이터마다 조건을 넣어서 데이터마다 image , text 들을 바뀌도록 하고 싶어서 찾고 있습니다. 이 방법은 Acitivty 코드를 만들어야하나요? Adapter 에 만들어야하나요? 바뀌도록 하려면 image,text 를 모두 mysql 에 넣어둬야 하나요? 아니면 android drawable 에만 넣어놔도 될까요?

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

      리스트뷰에 텍스트와 이미지를 혼용하여 보여준다는 의미인가요?

    • ILLHYHL 2020.06.29 10:29

      맞습니다. Activity 에서 text,image 에 if 를 걸어서 수치가 높아질때마다 text 와 image 를 다르게 보여주려고 합니다.
      그런데 onStart,onResume 에서 모두 if 를 걸어서 ArrayList <= 30 을 걸고 결과값을 내려고 하는 계속 ArrayList <= 30 <- 이곳에서 에러가 계속 발생해서 다른 방법을 계속 찾고 있습니다. 3일동안 해본 결과 답이 나오질 않았습니다. 결국 이렇게 다시 문의 하게되었습니다.
      private int i = 0; 0을 데이터에 나오는 수치로 바꿔서 조건을 걸어보려고 했지만 계속 실패했습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.06.29 19:44 신고

      ArrayList의 원소 갯수를 세어서 하려는거 맞지 않나요?

    • ILLHYHL 2020.06.30 13:48

      아닙니다. 원소 갯수를 세어서 보여주려고 하는게 아닙니다. Button 클릭시 image 변경 하는것처럼 Activity 보여줄때 바로 보여지도록 하려고 합니다.
      mysql에 저장되는 co,co2,온도,습도 수치가 있습니다. 수치가 숫자로 나옵니다. 온도는 27, 습도는 38 등등 그런데 저는 co의 수치를 가지고 10이 나오면 깨끗한 image 를 넣고 수치가 30 이상이 될 경우 더러운 image 를 넣으려고 합니다. 텍스는 좋음,나쁨으로 나타내려고 합니다. 수치를 지금 Adapter 에 담아 놓은 상태입니다.
      임의로 i = 0 ; 이라는 수치를 주고 if 에 i >= 30 으로 했을 경우에는 아주 잘 됩니다. 그러니 정확히 제가 하고 싶은것은 데이터 수치와 30 ( 데이터수치 >= 30 ) 를 조건을 걸어서 맞으면 맑은 image, 높으면 더러운 image 를 표시 하려고 합니다.
      Int i = 0 ; 이 아닌 Adapter i = 데이터수치; 로 바꿔서 비교하는 방법은 없나요? Adapter 를 형 변환해서
      DustAdapter dustView = new DustAdapter(this,dustArrayList);
      double dustView1 = Double.valueOf(dustView); 이런식으로 변형을 해서 사용해봤지만
      double dustView1 = Double.valueOf(String.valueOf(dustView)); 이렇게 하지 않으면 에러가 계속 발생합니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.06.30 19:45 신고

      데이터가 저장된 곳에서 데이터를 하나씩 가져오는 방법을 찾아보세요.

    • ILLHYHL 2020.07.02 09:17

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

      progressDialog.dismiss();
      Log.d(TAG, " result - " + result);
      double dust = (double) result.indexOf(??);
      if(dust >= 30){

      ?? php 에서 나오는 수치(1.5) 를 나오도록 해보고 있습니다. indexOf 를 사용하는게 맞나요?? 다른 방법이 있을까요??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.07.02 20:18 신고

      다음처럼 해보세요.

      String형 숫자를 double형으로 변환시키기.

      double tmp = Double.parseDouble("1.24657");


      [출처] [java] 자바 String형 <-> Double형 변환|작성자 햇님

    • ILLHYHL 2020.07.03 09:01

      double tmp = Double.parseDouble("1.24657"); 해보왔습니다 " " 안에 임의의 숫자를 넣는게 아니라 MySQL 에 있는 데이터를 그대로 가져오려고 하는겁니다. 이게 안되는거에요?

      모두 사용해봐도 Run 했을 경우
      "id": "1", name": "홍길동", "country": "조선" 중에 id 의 1만 나오도록 해야합니다. 방법이 없나요?

      Log.d(TAG," 백그라운드 작업이 완료 된 후 결과값을 얻었어요. - " + result);
      D/phptest: 백그라운드 작업이 완료 된 후 결과값을 얻었어요. - { "webnautes": [ { "id": "1", "name": "홍길동", "country": "조선" }, { "id": "2", "name": "잔다르크", "country": "프랑스" } ]}

      이렇게 출력이 됩니다. 그런데 제가 원하는거는 {"webnautes": 1 } 딱 1만 출력이 되도록 만들고싶습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.07.03 10:36 신고

      "1.24657" 대신에 string 변수를 넣으면 됩니더

    • ILLHYHL 2020.07.03 11:36

      감사합니다 드디어 해결이 되었습니다. 꾸준한 답변을 해주셔서 정말 고맙습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.07.03 11:37 신고

      다행입니다

  19. 2020.08.12 15:04

    비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.08.12 15:17 신고

      해당함수가 추후 버전에서 제거될 예정이라는 메시지입니다.

      error repoting줄과 그 다음줄을 주석처리하면 보이지 않게됩니다

    • 2020.08.12 15:19

      비밀댓글입니다

    • 2020.08.12 15:20

      비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.08.12 15:21 신고

      로그캣을 살펴보세요

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.08.12 15:21 신고

      레이아웃파일과 레이아웃 구성요소를 사용하는 코드를 다시 살펴보세요

    • 2020.08.12 15:22

      비밀댓글입니다

    • 2020.08.18 17:00

      비밀댓글입니다

    • 2020.08.18 17:21

      비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.08.18 18:42 신고

      JSONObject jsonObject = new JSONObject(mJsonString);에서 mJsonString 문자열에 엉뚱한값이 포함된게 아닐까 싶습니자.

  20. stephen 2020.09.03 15:42

    포스팅 도움 많이 받았습니다.
    파싱한 데이터를 리싸이클러뷰말고 텍스트뷰에 간단하게 표시하고 싶은데 어떻게 해야할까요..?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.09.04 01:11 신고

      텍스트 뷰에 추가하는 예제를 찾아보세요
      줄바꾸며 추가할수 있을듯합니다

  21. gdgd 2020.11.04 03:02

    안녕하세요, 올려주신 코드를 토대로 서버에서 데이터를 받아와 다른 api에 적용하려하는데 showResult 부분을 어떻게 작성해야 getdata 클래스가 아닌 MainActivity 메서드에서도 사용할 수 있을지 궁금합니다.

+ Recent posts