Full Stack Web Developer.
Syaku (샤쿠)

Java, JS (ES6+), Spring, Spring security, jQuery, Reactjs, Bootstrap.

        

11-26 15:34


Spring Boot 2 보기 Front-end 보기 DevOps 보기 Spring 3 보기 Spring Security 3 보기

안드로이드 스레드 XML 뷰 와 웹 이미지 뷰 (2) : Android XML Http AsyncTask ImageView Intent


written by Seok Kyun. Choi. 최석균

"안드로이드 스레드 XML 뷰와 웹 이미지 뷰"

> 이전 글 참조

2013/10/24 - [개발노트/안드로이드 SDK] - 안드로이드 스레드 XML 리스트 뷰 (1) : Android XML ListView Adapter Http AsyncTask



* 개발환경


- 안드로이드 버전

minSdkVersion : 16 (Android 4.1.2)

targetSdkVersion 18 (Android 4.3)


- 개발 플렛폼 Mac OS X 10.8.5 ADT (Android Developer Tools Build: v22.2.1-833290)



이전 포스팅과 이어지는 글입니다. 필히 이전 글을 참조하시기 바랍니다. 

이번 포스팅은 리스트 뷰에서 출력된 목록을 클릭했을 때 상세페이지로 이동하는 과정과 출력되는 부분을 포스팅합니다.

추가로 웹 이미지 파일을 출력하는 방법도 포함하였습니다.


- resource 는 첨부파일을 참조하고 자바 소스만 포스팅하겠습니다. 

  (HttpConnection 클래스와 Xml2Object 클래스도 생략합니다. 이전 포스팅 참조하세요)



SyakuXmlApp.zip






메인 액티비티 클래스


이전 포스팅에서 추가된 부분은 리스트 뷰에 OnClick 이벤트와 이동될때 전송되어야 할 자료를 보내주는 작업입니다.

리스트뷰에 사용하는 onClick 이벤트는 OnItemClickListener 입니다.

아래 소스에서 추가된 주석을 참고하세요.



package com.syaku;

import java.io.InputStream;
import java.util.ArrayList;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseArray;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;

public class SyakuMain extends Activity {
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.syaku_main);
		
		// XML 데이터 호출
		XmlAsyncTask xml = new XmlAsyncTask(this);
		String url = "http xml url";
		xml.execute(url);
	}
	
	// AsyncTask 스레드 OnItemClickListener 상속 받아야 합니다.
	class XmlAsyncTask extends AsyncTask< String, Void , ArrayList<SparseArray<String>> > implements OnItemClickListener{
		Context context;
		ArrayList<XmlBean> list_item;
		
		public XmlAsyncTask(Context context) {
			this.context = context;
		}
		
		@Override
		protected ArrayList<SparseArray<String>> doInBackground(String... params) {
			ArrayList<SparseArray<String>> list = new ArrayList<SparseArray<String>>();
			
			try {
				
				String url = params[0];
				HttpConnection http = new HttpConnection(url);
				InputStream input_stream = http.getInputStream();
				
				Xml2Object xml = new Xml2Object(input_stream);
				list = xml.list("item");
			} catch (Exception e) {
				Log.e("GET ERROR",e.toString());
			}
			
			return list;
		}
		
		@Override
		protected void onPostExecute(ArrayList<SparseArray<String>> result) {
			super.onPostExecute(result);
			
			int count = result.size();
			Log.d("ArrayList count",""+count);
			
			TextView tv = (TextView) findViewById(R.id.list_count);
			tv.setText(""+count);
			
			list_item = new ArrayList<XmlBean>();

			for (int i = 0; i < count; i++) {
				SparseArray<String> data = result.get(i);
				
				XmlBean bean = new XmlBean();
				
				String bunmyo_orl = data.get(bean.BUNMYO_ORL);
				String subject = data.get(bean.SUBJECT);
				String rdate = data.get(bean.RDATE);
				
				bean.setBunmyo_orl(bunmyo_orl);
				bean.setSubject(subject);
				bean.setRdate(rdate);
				
				list_item.add(bean);
			}
			
			XmlListAdapter adapter = new XmlListAdapter(context, R.layout.list, list_item);
			ListView listView = (ListView) findViewById(R.id.list_view);
			listView.setOnItemClickListener(this); // OnClick 이벤트 활성화
			listView.setAdapter(adapter);
		}
		
		@Override
		public void onItemClick(AdapterView<?> partent, View view, int position, long id) { // OnClick 이벤트 프로그램
			String bunmyo_orl = list_item.get(position).bunmyo_orl;
			
			Intent intent = new Intent(SyakuMain.this,SyakuView.class); // 이벤트가 일어났을 때 이동할 액티비티 클래스
			intent.putExtra("bunmyo_orl", bunmyo_orl); // 전송될 자료 담기
			startActivity(intent);
			finish();
		}
	}
	
}



상세보기 액티비티 클래스


메인 액티비티에서 전송된 자료를 이용해 해당 목록을 조회하여 출력합니다.

추가로 특정 웹 이미지도 함께 출력되게 작업했습니다.

[추가] 이미지와 xml 데이터를 서로 다른 스레드에서 작업하였지만, 한개 스레드 메서드에서도 가능합니다.


AndroidManifest.xml 에 액티비티를 추가하세요.

<activity android:name="com.syaku.SyakuView" />


아래 소스에서 추가된 주석을 참고하세요.


package com.syaku;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.util.SparseArray;
import android.widget.ImageView;
import android.widget.TextView;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class SyakuView extends Activity {
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.view);
		
		Intent intent = getIntent();
		String bunmyo_orl = intent.getStringExtra("bunmyo_orl");
		
		// XML 데이터 호출
		XmlAsyncTask xml = new XmlAsyncTask();
		String url = "http://syaku.tistory.com/rss?no=" + bunmyo_orl; // 올바르지 않은 url 입니다. 사용하지 마세요~ ^_~
		xml.execute(url);
		
		// 이미지 호출
		String target_url = "http://sstatic.naver.net/search/img3/h1_naver2.png";
		ImageAsyncTask image = new ImageAsyncTask();
		image.execute(target_url);
		
	}
	

	// 이미지 스레드 
	class ImageAsyncTask extends AsyncTask<String, Void, Bitmap> {
		
		@Override
		protected Bitmap doInBackground(String... params) {
			Bitmap bitmap = null;
			
			try {
				String target_url = params[0];
				URL url = new URL(target_url);
				
			    URLConnection conn = url.openConnection();
			    conn.connect();
			    
			    BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
			    bitmap = BitmapFactory.decodeStream(bis);
			    bis.close();
			} catch (Exception e) {
			}
			
			return bitmap;
		}
		
		@Override
		protected void onPostExecute(Bitmap result) {
			super.onPostExecute(result);
			
			ImageView image = (ImageView) findViewById(R.id.image);
			image.setImageBitmap(result);
		}
		
	}
	
	// AsyncTask 스레드
	class XmlAsyncTask extends AsyncTask< String, Void , SparseArray<String> > {
		
		@Override
		protected SparseArray<String> doInBackground(String... params) {
			SparseArray<String> item = new SparseArray<String>();
			
			try {
				
				String url = params[0];
				HttpConnection http = new HttpConnection(url);
				InputStream input_stream = http.getInputStream();
				
				Xml2Object xml = new Xml2Object(input_stream);
				item = xml.object("item");
			} catch (Exception e) {
				Log.e("GET ERROR",e.toString());
			}
			
			return item;
		}
		
		@Override
		protected void onPostExecute(SparseArray<String> result) {
			super.onPostExecute(result);
			
			XmlBean bean = new XmlBean();
			
			String subject = result.get(bean.SUBJECT);
			String content = result.get(bean.CONTENT);
			String user_name = result.get(bean.USER_NAME);
			String rdate = result.get(bean.RDATE);
			
			TextView tv;
			
			tv = (TextView) findViewById(R.id.subject);
			tv.setText(subject);
			
			//tv = (TextView) findViewById(R.id.user_name);
			//tv.setText(user_name);
			
			//tv = (TextView) findViewById(R.id.rdate);
			//tv.setText(rdate);
			
			tv = (TextView) findViewById(R.id.content);
			tv.setText(Html.fromHtml(content)); // 데이터가 html 형식일 경우 포맷에 맞게 출력합니다.
		}
		
	}
}










posted syaku blog

Syaku Blog by Seok Kyun. Choi. 최석균.

http://syaku.tistory.com


  • 데니스 at 2014.04.03 15:22

    안녕하세요
    onItemClick이 인식이 안되서 그런데
    bunmyo_orl 역학이 무엇인지요

    db테이블인가요.... 아님 컬럼인가요..

    좀 자세하게 설명좀 부탁드립니다.^^

    • 샤쿠 syaku at 2014.04.03 15:58 신고

      데이터 키 값을 답고 있는 컬럼입니다.

      게시판의 게시물로 예로들면
      게시판 목록에서 특정 게시물의 상세보기하려면 클릭하여 이동하잖아요 이동 될때 고유 데이터 번호를 넘겨주는 데
      bunmyo_orl 도 고유 데이터 번호를 가지고 있는 컬럼 명인 거죠

  • 데니스 at 2014.04.03 17:16

    답변 너무 감사드립니다.

    url 부분 String url = "http://********.kr/android/odtTt.php & ttNo=" + ttNo;

    이렇게 넣어면 되죠^^

    근데 문제는 데이타 값이 안불려와 지네요 url 에서 & 뒤에 꺼 제거 하면 불려는 와지는데
    포지션 0번 내용이 전부 다 불려 와지네요 ㅋ

    제가 아직 완젼초보라... 님꺼 겨우 몇일 하면서 해결 했는데 끝물에서 안되네요^^ 조언좀 부탁드립니다.

    • 샤쿠 syaku at 2014.04.03 19:16 신고

      URL 파라메터 시작은 ? 시작하셔야합니다.
      예 http://aaa.com/aaa.php?aaa=1

      ?로 시작해서 & 이어가는 형식이죠
      예 http://aaa.com/aaa.php?aaa=1&bb=1&ccc=2

      그래서 &가 아니고 ?가 되어야겠네요
      String url = "http://********.kr/android/odtTt.php?ttNo=" + ttNo;

  • 데니스 at 2014.04.03 21:59

    답변 너무 감사합니다 ^^

    근데 또 여쭤볼게 ㅠㅠ 인텐터로 해서 넘어 오긴하는데 첫번째 포지션에 있는 값이 넘어온 포지션 0번 1번 2번...

    모두 같은 값이 출력이 됩니다. ㅠㅠ settext를 하면 각각의 db내용이 불려 와야 하는데 하나만 넘어 오네요

    처음 리스트뷰 뿌릴때는 각각 db내용이 뿌려지는데 인텐터로 넘기면 이런현상이.. 여기서 막히니 앞으로 가지를 못합니다.

    너무 귀찮게 해드려 죄송합니다.ㅠㅠ ~~ 덕분에 많은 도움을 받았지만 염치 불구 하고 요것만 해결이 되도록 좀 부탁드립니다.

댓글 남기기
◀ PREV 1···117118119120121122123124125···313 NEXT ▶