728x90

서버에서 데이터를 가져오는 방법은 http://link2me.tistory.com/1247 참조하면 된다.

실제 파일을 연습해볼 수 있는 샘플을 첨부한다. 첨부파일은 링크 게시물에 올려진 파일과는 다르고 아래 기술되는 내용의 연속성 측면에서 새롭게 작성한 파일이다. 이 파일을 기반으로 수정해서 ListData 를 만들것이다.


json_demo_getServerData.zip

json_demo_server_PHP.zip



이제 서버에서 가져온 데이터를 ArrayList 에 추가하는 방법에 대해 알아보자.


private ArrayList<String> personData = new ArrayList<String>();

로 선언을 해준다.

그리고 기본 ArrayAdapter 를 통해 ListView 에 뿌려준다.


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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <EditText
            android:id="@+id/et_text01"
            android:hint="검색어"
            android:layout_weight="8"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/btn_search"
            android:text="검색"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <ListView
        android:id="@+id/lv_listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

 MainActivity.java

 import android.app.Activity;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

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

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    public SharedPreferences settings;
    private ListView listView; // 리스트뷰
    private EditText editText;
    private Button btn_search;

    private ArrayList<String> personData = null; // 데이터 리스트
    private ArrayAdapter<String> arrayAdapter = null; // 리스트뷰에 사용되는 ArrayAdapter

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

        listView = (ListView) findViewById(R.id.lv_listView);
        editText = (EditText) findViewById(R.id.et_text01);

        personData = new ArrayList<String>(); // ArrayList 생성

        // ArrayAdapter 생성
        arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,personData);

        listView.setAdapter(arrayAdapter); // 어댑터를 리스트뷰에 세팅

        btn_search = (Button) findViewById(R.id.btn_search);
        btn_search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                settings = getSharedPreferences("settings", Activity.MODE_PRIVATE);
                Uri.Builder builder = new Uri.Builder()
                        .appendQueryParameter("search", editText.getText().toString().trim())
                        .appendQueryParameter("idx", "2"); // settings.getString("idx","")
                String postParams = builder.build().getEncodedQuery();
                new getJSONData().execute(Value.IPADDRESS + "/get_json.php",postParams);
            }
        });
    }

    class getJSONData extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            try {
                return PHPComm.getJson(params[0],params[1]);
            } catch (Exception e) {
                return new String("Exception: " + e.getMessage());
            }
        }

        protected void onPostExecute(String result){
            searchJSON=result;
            showList();
        }
    }

    // 서버 정보를 파싱하기 위한 변수 선언
    String searchJSON;
    private static final String TAG_RESULTS="result";
    private static final String TAG_UID = "uid"; // 서버 테이블의 실제 필드명
    private static final String TAG_NAME = "name";
    private static final String TAG_Mobile ="mobileNO";
    JSONArray peoples = null;

    protected void showList() {
        try {
            JSONObject jsonObj = new JSONObject(searchJSON);
            peoples = jsonObj.getJSONArray(TAG_RESULTS);

            personData.clear(); // 서버에서 가져올 때마다 초기화

            for(int i=0;i<peoples.length();i++){
                JSONObject c = peoples.getJSONObject(i);
                String uid = c.getString(TAG_UID);
                String name = c.getString(TAG_NAME);
                String mobile = c.getString(TAG_Mobile);

                String data = uid + " : " + name + " | " + mobile;
                personData.add(data); // 데이터 추가
            }

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // 갱신된 데이터 내역을 어댑터에 알려줌
                    arrayAdapter.notifyDataSetChanged();
                }
            });

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


위 코드는 ListView에 단순한 형태로 뿌려주는 기능만 테스트를 했다.


ListView Row를 눌렀을 때 이벤트를 거는 걸 처리해보자.

보통 AdapterView.onItemClickListener 를 이용하여, 이벤트 처리를 해준다.

onItemClickListener는 CallBack Listener 다. CallBack 이란 ListView의 한 Row(행)을 클릭했을 때, 시스템에서 클릭에 반응하여 다시 사용자에게 알려주는 것을 말한다.
ListView의 Row 를 클릭했을 때 그 Row에 해당하는 adapterView, view, position 등을 시스템에서 사용자에게 전달해주는 것이다.

listView.setOnItemClickListener(itemClickListener); // 이벤트 처리

// ListView에서 아이템을 누르면 반응하는 이벤트이기때문에 onItemClickListener를 ListView에 추가

private AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
        String textView = (String) adapterView.getAdapter().getItem(position);
        Toast.makeText(MainActivity.this, textView, Toast.LENGTH_SHORT).show();

        Toast.makeText(getApplicationContext(), "" + position, Toast.LENGTH_SHORT).show();
    }
};


position 은 선택한 Row의 index 값을 반환한다.



이미지, 텍스트, 버튼을 혼용하는 View 를 ListView 에 보여주는 방법은 많은 테스트를 해보고 작성하련다.

ArrayList<String> 형을 ArrayList<PersonData> 제네릭 형으로 변경하고, 데이터를 add 하면 에러가 발생한다.


private ArrayList<String> personData = null; // 데이터 리스트
private ArrayAdapter<String> arrayAdapter = null; // 리스트뷰에 사용되는 ArrayAdapter

 private ArrayList<PersonData> personData = null; // 데이터 리스트
private ArrayAdapter<PersonData> arrayAdapter = null; // 리스트뷰에 사용되는 ArrayAdapter


arrayAdapter = new ArrayAdapter<PersonData>(this,android.R.layout.simple_list_item_1,personData); AdapterView 에서 처리를 못해서 생기는 에러로 보인다.

블로그 이미지

Link2Me

,