public void setFileName(String fileName) { this.fileName = fileName; }
public String getFilePath() { return filePath; }
public void setFilePath(String filePath) { this.filePath = filePath; }
public String getCurPath() { return curPath; }
public void setCurPath(String curPath) { this.curPath = curPath; }
public String getIsFile() { return isFile; }
public void setIsFile(String isFile) { this.isFile = isFile; } }
Gson 라이브러리를 사용하지 않고 서버 데이터를 가져와서 RecyclerView 에 보여주는 코드중에서 비교할 수 있는 것만 발췌했다.
Gson 라이브러리 사용 이전 코드
RecyclerView audiolistView; // 리스트뷰 (ListView 대신 RecyclerView) private ArrayList<FileList_Item> fileList = new ArrayList<>(); // 스트리밍 전체 리스트 RecyclerView.Adapter listViewAdapter; // ListViewAdapter 대신 RecyclerView.Adapter
// 서버 정보를 파싱하기 위한 변수 선언 private static final String TAG_RESULTS="result"; private static final String TAG_fileNAME = "fileName"; private static final String TAG_filePATH ="filePath"; private static final String TAG_curPATH ="curPath"; private static final String TAG_isFile ="isFile"; JSONArray audiofiles = null;
fileList.clear(); // 서버에서 가져온 데이터 초기화 if(!TextUtils.isEmpty(currentPath)){ int i = currentPath.lastIndexOf("/"); FileAllList("상위폴더", currentPath, currentPath.substring(0,i), "2"); } for(int i = 0; i < audiofiles.length(); i++){ JSONObject c = audiofiles.getJSONObject(i); final String fileName = c.getString(TAG_fileNAME); final String filePath = c.getString(TAG_filePATH); final String curPath = c.getString(TAG_curPATH); final String isFile = c.getString(TAG_isFile);
// 서버에서 가져온 데이터 저장 FileAllList(fileName, filePath, curPath, isFile); }
runOnUiThread(new Runnable() { // 화면에 반영하기 위하여 runOnUiThread()를 호출하여 실시간 갱신한다. @Override public void run() { // 갱신된 데이터 내역을 어댑터에 알려줌 listViewAdapter.notifyDataSetChanged(); } }); } catch (JSONException e) { e.printStackTrace(); }
}
// 파일 리스트 추가를 위한 메소드 public void FileAllList(String fileName, String filePath, String curPath, String isFile){ FileList_Item item = new FileList_Item(); item.setFileName(fileName); item.setFilePath(filePath); item.setCurPath(curPath); item.setIsFile(isFile); fileList.add(item); }
listViewAdapter = new ListViewAdapter(this,fileList); // Adapter 생성 audiolistView.setAdapter(listViewAdapter); // 어댑터를 리스트뷰에 세팅
코드 부분을 onCreate 에 추가하고 listViewAdapter.notifyDataSetChanged(); 를 하면 JSON Array 데이터가 RecyclerView 에 잘 보인다.
Gson 라이브러리 사용 코드
RecyclerView audiolistView; // 리스트뷰 (ListView 대신 RecyclerView) private ArrayList<FileList_Item> fileList = new ArrayList<>(); // 스트리밍 전체 리스트 RecyclerView.Adapter listViewAdapter; // ListViewAdapter 대신 RecyclerView.Adapter
// 서버 정보를 파싱하기 위한 변수 선언 private static final String TAG_RESULTS="result"; JSONArray audiofiles = null;
fileList.clear(); // 서버에서 가져온 데이터 초기화 // 상위폴더 인식을 별도로 만들어준 ArrayList 가 전혀 먹히지 않는다. if(!TextUtils.isEmpty(currentPath)){ int i = currentPath.lastIndexOf("/"); FileAllList("상위폴더", currentPath, currentPath.substring(0,i), "2"); }
Gson gson = new Gson(); Type listType = new TypeToken<ArrayList<FileList_Item>>(){}.getType(); fileList = gson.fromJson(audiofiles.toString(), listType);
// 어댑터 생성 및 리스트뷰에 세팅을 여기에 추가해야만 정상적으로 RecyclerView에서 보이더라. listViewAdapter = new ListViewAdapter(this,fileList); // Adapter 생성 audiolistView.setAdapter(listViewAdapter); // 어댑터를 리스트뷰에 세팅
}
// 파일 리스트 추가를 위한 메소드 // 이건 무용지물이더라. public void FileAllList(String fileName, String filePath, String curPath, String isFile){ FileList_Item item = new FileList_Item(); item.setFileName(fileName); item.setFilePath(filePath); item.setCurPath(curPath); item.setIsFile(isFile); fileList.add(item); }
Gson gson = new Gson(); Type listType = new TypeToken<ArrayList<FileList_Item>>(){}.getType(); fileList = gson.fromJson(audiofiles.toString(), listType);
검색해보면 위 코드 3줄이면 해결된다고 모두 답변이 되어 있다. 그런데도 불구하고 RecyclerView 에 출력되지 않았다.
서버에서 가져온 JSON Array 데이터를 ArrayList 에 추가하는 코드가 매우 간단해진다는 건 알았다.
상위폴더 ArrayList 를 별도로 만들 필요가 없는 경우에는 매우 유용할 거 같다.
Stackoverflow 에 질문한 내용을 검색해보니 RecyclerView 에 데이터 보이지 않는다고 질의한 사항이 몇건 있었다. System.out.println 으로 찍어보면 데이터가 ArrayList에 정상적으로 추가되어 있다. 그러나 화면에 보이지 않았다.
Android RecyclerView JSON Parsing using Retrofit 게시글을 보니까 ArrayList 데이터를 추가하고 난 후 바로 다음 줄에 아래 2줄을 적어준 걸 보고 시도했더니 폰 화면에 정상적으로 출력된다.
listViewAdapter = new ListViewAdapter(this,fileList); // Adapter 생성 audiolistView.setAdapter(listViewAdapter); // 어댑터를 리스트뷰에 세팅
Gson 라이브러리를 사용하면 JSON Array 데이터를 String으로 하나하나 분리할 필요없이 ArrayList에 바로 추가할 수 있어 코드가 심플해지는거 같다.
단, Class 에서 생성한 변수명과 서버(PHP)에서 json_encode로 생성한 변수명이 동일해야 하는거 같다.
서버에서 생성한 데이터가 JSON Object 가 아니라 JSON Array 면 코드가 더 심플해질 수 있는거 같다.
상위폴더를 안드로이드 Java 코드에서 생성한 것을 없애고, 서버 PHP 코드에서 구현하는 것으로 변경하고 테스트를 해보니 정상적으로 잘 처리된다.
코드 줄어든 것만 발췌하여 비교한다.
=== Gson 라이브러리 미사용 코드 ===
// 서버 정보를 파싱하기 위한 변수 선언 private static final String TAG_RESULTS="result"; private static final String TAG_fileNAME = "fileName"; private static final String TAG_filePATH ="filePath"; private static final String TAG_curPATH ="curPath"; private static final String TAG_isFile ="isFile"; JSONArray audiofiles = null;
fileList.clear(); // 서버에서 가져온 데이터 초기화 for(int i = 0; i < audiofiles.length(); i++){ JSONObject c = audiofiles.getJSONObject(i); final String fileName = c.getString(TAG_fileNAME); final String filePath = c.getString(TAG_filePATH); final String curPath = c.getString(TAG_curPATH); final String isFile = c.getString(TAG_isFile);
// 서버에서 가져온 데이터 저장 FileAllList(fileName, filePath, curPath, isFile); }
runOnUiThread(new Runnable() { // 화면에 반영하기 위하여 runOnUiThread()를 호출하여 실시간 갱신한다. @Override public void run() { // 갱신된 데이터 내역을 어댑터에 알려줌 listViewAdapter.notifyDataSetChanged(); } }); } catch (JSONException e) { e.printStackTrace(); }
}
// 파일 리스트 추가를 위한 메소드 public void FileAllList(String fileName, String filePath, String curPath, String isFile){ FileList_Item item = new FileList_Item(); item.setFileName(fileName); item.setFilePath(filePath); item.setCurPath(curPath); item.setIsFile(isFile); fileList.add(item); }
=== Gson 라이브러리 사용한 코드 ====
// 서버 정보를 파싱하기 위한 변수 선언 private static final String TAG_RESULTS="result"; JSONArray audiofiles = null;
fileList.clear(); // 서버에서 가져온 데이터 초기화 Gson gson = new Gson(); Type listType = new TypeToken<ArrayList<FileList_Item>>(){}.getType(); fileList = gson.fromJson(audiofiles.toString(), listType); listViewAdapter = new ListViewAdapter(this,fileList); // Adapter 생성 audiolistView.setAdapter(listViewAdapter); // 어댑터를 리스트뷰에 세팅 }
정리 핵심
Gson gson = new Gson(); JSONArray jsonArray = new JSONArray(JSONdata); Type listType = new TypeToken<ArrayList<FileList_Item>>(){}.getType(); ArrayList<FileList_Item> myFileList = gson.fromJson(jsonArray.toString(), listType);