서버에서 데이터를 가져오는 방법은 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 에서 처리를 못해서 생기는 에러로 보인다.