[안드로이드] - 받아온 JSON 데이터 RecyclerView에 보여주기 (4)
○ 받아온 JSON 데이터 RecyclerView에 보여주기 (4) |
build.gradle (Module: app) 에 추가 // 카드뷰와 리싸이클러뷰 위한 implementation 'com.android.support:recyclerview-v7:27.+' implementation 'com.android.support:cardview-v7:27.+' // 이미지 로더 위한 피카소 implementation 'com.google.code.gson:gson:2.8.1' implementation 'com.squareup.picasso:picasso:2.5.2' // 카드뷰 애니메이션 위한 implementation 'com.daimajia.easing:library:2.0@aar' implementation 'com.daimajia.androidanimations:library:2.3@aar' AndroidManifest.xml 에 추가 <uses-permission android:name="android.permission.INTERNET" /> // 1. activity_main.xml ( 리싸이클러뷰를 통해 데이터 보여주기 위한 ) <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:layout_marginBottom="5dp" android:background="#479CDE" android:textAlignment="center" android:textColor="#ffffff" android:textStyle="bold" android:textSize="18sp" android:text="공연뉴스" android:layout_width="match_parent" android:layout_height="wrap_content" /> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/recyclerView"> </android.support.v7.widget.RecyclerView> </LinearLayout> // 2. card_layout_main.xml ( 카드뷰들을 뿌려주기 위한 하나의 뷰를 만듬 ) <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="250dp" card_view:cardCornerRadius="5dp" card_view:cardElevation="10dp" android:id="@+id/cardSiteCardView" android:layout_margin="5dp" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:layout_width="match_parent" android:layout_height="170dp" android:id="@+id/cardSiteImage" android:scaleType="centerCrop"/> <TextView android:textStyle="bold" android:id="@+id/cardSiteTitle" android:gravity="center_vertical" android:layout_width="match_parent" android:singleLine="true" android:ellipsize="end" android:layout_height="30dp" /> <TextView android:ellipsize="end" android:id="@+id/cardSiteText" android:gravity="center_vertical" android:layout_width="match_parent" android:layout_height="50dp" /> </LinearLayout> </android.support.v7.widget.CardView> // 3. CardForSite.java ( 가져와서 사용할 데이터들 객체 정리 ) public class CardForSite { private String siteTitle; private String siteLink; private String siteImage; private String sitetext; public CardForSite(String siteTitle, String siteLink, String siteImage, String sitetext) { this.siteTitle = siteTitle; this.siteLink = siteLink; this.siteImage = siteImage; this.sitetext = sitetext; } public String getSiteTitle() { return siteTitle; } public void setSiteTitle(String siteTitle) { this.siteTitle = siteTitle; } public String getSiteLink() { return siteLink; } public void setSiteLink(String siteLink) { this.siteLink = siteLink; } public String getSiteImage() { return siteImage; } public void setSiteImage(String siteImage) { this.siteImage = siteImage; } public String getSitetext() { return sitetext; } public void setSitetext(String sitetext) { this.sitetext = sitetext; } } // 4. RecycleAdapter ( 실제 리싸이클러뷰 어댑터를 만든다 중요! ) package com.example.jihoon.yundongtest; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.support.v7.widget.CardView; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.daimajia.androidanimations.library.Techniques; import com.daimajia.androidanimations.library.YoYo; import com.squareup.picasso.Picasso; import java.util.List; /** * Created by riu on 2018-03-31. */ public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.ViewHolder> { private List<CardForSite> dataList; private int itemLayout; /** * 생성자 * @param items * @param itemLayout */ public RecycleAdapter(List<CardForSite> items , int itemLayout){ this.dataList = items; this.itemLayout = itemLayout; } /** * 레이아웃을 만들어서 Holer에 저장 * @param viewGroup * @param viewType * @return */ @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(itemLayout,viewGroup,false); return new ViewHolder(view); } /** * listView getView 를 대체 * 넘겨 받은 데이터를 화면에 출력하는 역할 * * @param viewHolder * @param position */ @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { final CardForSite item = dataList.get(position); viewHolder.cardSiteTitle.setText(item.getSiteTitle()); viewHolder.cardSiteText.setText(item.getSitetext()); viewHolder.itemView.setTag(item); // 애니메이션 FadeIn 카드뷰에 적용하기 위한 YoYo.with(Techniques.FadeIn).playOn(viewHolder.cardSiteCardView); // 피카소를 이용하여 url 이미지 쉽게 하기 위한 // gradle에 넣어야할 것도 있음 String imageUrl = item.getSiteImage(); Context context = viewHolder.cardSiteImage.getContext(); Picasso.with(context) .load(imageUrl) .into(viewHolder.cardSiteImage); // 아이템뷰(하나의 카드뷰) 링크 클릭 리스너 viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent it = new Intent(Intent.ACTION_VIEW, Uri.parse(item.getSiteLink())); view.getContext().startActivity(it); } }); } @Override public int getItemCount() { return dataList.size(); } /** * 뷰 재활용을 위한 viewHolder */ public static class ViewHolder extends RecyclerView.ViewHolder { public TextView cardSiteTitle; public TextView cardSiteText; public ImageView cardSiteImage; public CardView cardSiteCardView; public ViewHolder(View itemView) { super(itemView); // 카드뷰 애니메이션 처리를 위한 cardSiteCardView = (CardView)itemView.findViewById(R.id.cardSiteCardView); cardSiteTitle = (TextView) itemView.findViewById(R.id.cardSiteTitle); cardSiteText = (TextView) itemView.findViewById(R.id.cardSiteText); cardSiteImage = (ImageView) itemView.findViewById(R.id.cardSiteImage); } } } 5. MainActivity.java (실제 어댑터를 적용 및 데이터 JSON 등) public class MainActivity extends AppCompatActivity { RecyclerView lecyclerView; ArrayList<CardForSite> list = new ArrayList<>(); Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lecyclerView = (RecyclerView)findViewById(R.id.recyclerView); // 나의 ip(localhost, 127.0.0.1 안댐)/JSP프로젝트명/연결할jsp파일명 String url = "http://10.0.2.2:8080/testcrawl/index.jsp"; NetworkTask networkTask = new NetworkTask(url, null); networkTask.execute(); // 뷰를 띄우기 위한 구문(이렇게 안뜨면 아래로 방법으로) lecyclerView.setAdapter(new RecycleAdapter(list, R.layout.card_layout_main)); lecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); lecyclerView.setItemAnimator(new DefaultItemAnimator()); // 위에껄로 하다보니 데이터를 많이 가져와 띄워주니 안뜨는 거를 볼 수 있었다 // 핸들러를 통해 1초 이후에 뜨게 하니 정상적으로 잘 뜬다!!! handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { lecyclerView.setAdapter(new RecycleAdapter(list, R.layout.card_layout_main)); lecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); lecyclerView.setItemAnimator(new DefaultItemAnimator()); } }, 1000); // 1000 = 1초 후 도출 } public class NetworkTask extends AsyncTask<Void, Void, String> { private String url; private ContentValues values; public NetworkTask(String url, ContentValues values) { this.url = url; this.values = values; } @Override protected String doInBackground(Void... params) { String result; // 요청 결과를 저장할 변수. RequestHttpURLConnection requestHttpURLConnection = new RequestHttpURLConnection(); result = requestHttpURLConnection.request(url, values); // 해당 URL로 부터 결과물을 얻어온다. return result; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); //textView.setText(s); } } public class RequestHttpURLConnection { public String request(String _url, ContentValues _params) { // HttpURLConnection 참조 변수. HttpURLConnection urlConn = null; // URL 뒤에 붙여서 보낼 파라미터. StringBuffer sbParams = new StringBuffer(); /** * 1. StringBuffer에 파라미터 연결 * */ // 보낼 데이터가 없으면 파라미터를 비운다. if (_params == null) // sbParams.append(""); // sbParams.append("miseID=" + miseID); //sbParams.append("&misePW=" + misePW); //sbParams.append("miseID=test001&misePW=test001&miseNAME=테스트001"); //sbParams.append("memberID=test123&password=test123&name=꼬북이&email=test123@naver.com"); // 보낼 데이터가 있으면 파라미터를 채운다. /** * 2. HttpURLConnection을 통해 web의 데이터를 가져온다. * */ try { URL url = new URL(_url); urlConn = (HttpURLConnection) url.openConnection(); // [2-1]. urlConn 설정. urlConn.setRequestMethod("POST"); // URL 요청에 대한 메소드 설정 : POST. urlConn.setRequestProperty("Accept-Charset", "UTF-8"); // Accept-Charset 설정. urlConn.setRequestProperty("Context_Type", "application/x-www-form-urlencoded;cahrset=UTF-8"); // [2-2]. parameter 전달 및 데이터 읽어오기. String strParams = sbParams.toString(); //sbParams에 정리한 파라미터들을 스트링으로 저장. 예)id=id1&pw=123; OutputStream os = urlConn.getOutputStream(); os.write(strParams.getBytes("UTF-8")); // 출력 스트림에 출력. os.flush(); // 출력 스트림을 플러시(비운다)하고 버퍼링 된 모든 출력 바이트를 강제 실행. os.close(); // 출력 스트림을 닫고 모든 시스템 자원을 해제. // [2-3]. 연결 요청 확인. // 실패 시 null을 리턴하고 메서드를 종료. if (urlConn.getResponseCode() != HttpURLConnection.HTTP_OK) return null; // [2-4]. 읽어온 결과물 리턴. // 요청한 URL의 출력물을 BufferedReader로 받는다. BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream(), "UTF-8")); // 출력물의 라인과 그 합에 대한 변수. String line; String page = ""; // 라인을 받아와 합친다. // 버퍼의 웹문서 소스를 줄 단위로 읽어(line), page에 저장함 while ((line = reader.readLine()) != null) { page += line; } try { // JSP에서 보낸 JSON 받아오자 JSONObject = siteDataMain JSONObject json = new JSONObject(page); JSONArray jArr = json.getJSONArray("siteDataMain"); // JSON이 가진 크기만큼 데이터를 받아옴 for (int i = 0; i < jArr.length(); i++) { json = jArr.getJSONObject(i); System.out.println(i + "번째 데이터 : " + json.getString("siteTitle")); System.out.println(i + "번째 데이터 : " + json.getString("siteLink")); System.out.println(i + "번째 데이터 : " + json.getString("siteImage")); System.out.println(i + "번째 데이터 : " + json.getString("siteText")); System.out.println("\n"); list.add(new CardForSite(json.getString("siteTitle"), json.getString("siteLink"), json.getString("siteImage"), json.getString("siteText"))); } /* 여기까지 서버가 보낸 데이터를 받아 왔다. 밑에는 확인을 위한 수행 */ //String data = "받은 데이터 : " + getJsonData[0] + " " + getJsonData[1]; //setTextView(data); } catch(Exception e){ e.printStackTrace();; } } catch (MalformedURLException e) { // for URL. e.printStackTrace(); } catch (IOException e) { // for openConnection(). e.printStackTrace(); } finally { if (urlConn != null) urlConn.disconnect(); } return null; } } } |
'JSP 안드로이드' 카테고리의 다른 글
[안드로이드] - JSP에서 안드로이드 JSON 데이터 받아오기 (3) (0) | 2018.05.24 |
---|---|
[JSP] - jsoup 크롤링 데이터 JSON화 시키기 (2) (0) | 2018.05.24 |
[JSP] - jsoup 이용한 웹 크롤링하기 (1) (0) | 2018.05.24 |