마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

쓰레드를 이용한 리스트뷰 화면 출력이 안되요

0 추천

Adapter.java  랑  S_BusData.java는 그렇게 중요하지 않아서 생략했어요

제가 안되는 점은 데이터를 받아서, 저장까지는 되는걸 확인을 했어요

저장된 걸, 리스트뷰를 통해서 보여줘야하는데, 안보여주네요 .. ㅠㅠ 어디서 문제가 있는 걸까요 ?? ㅠㅠ

 

package com.example.busalram;

import java.net.URL;
import java.util.ArrayList;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import android.app.Activity;
import android.content.ClipData.Item;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class SeoulBus extends Activity{	
	private ArrayList<S_BusData> contacts = new ArrayList<S_BusData>();
	private PoemAdapter ap;
	private ListView lv;
	private ArrayList<String> arsId, stNm, rtNm, traTime2, traTime1;
	String BusNumber_Main;
	public ArrayList<Poem> listPoem = null;
	int time=0;
	
	private Runnable ListViewUI = new Runnable(){
		public void run(){
			SeoulBus.this.ap.notifyDataSetChanged();
		}
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.daejon);
        
        //쓰레드에서 외부 URL을 사용하기 위한 StrictMode 작업
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    	StrictMode.setThreadPolicy(policy);
        
        Intent intent = getIntent();
        BusNumber_Main = intent.getStringExtra("BusNumber");
        
        //if(BusNumber_Main == null){ BusNumber_Main = "24002"; }
        //else{ BusNumber_Main = "24002"; }

		//getPoem();
        
		XMLParser XML = new XMLParser();
        try{
        	XML.start();
        } catch(Exception e){
        	XML.interrupt();
        }
        lv = (ListView)findViewById(R.id.buslist);
        ap = new PoemAdapter(this, R.layout.row, contacts);
        lv.setAdapter(ap);
        setListViewHeightBasedOnChildren(lv);
	}
	
	private void addItem(S_BusData item){
		this.contacts.add(item); //ListView에 출력시키기 위해 배열리스트 추가
		this.runOnUiThread(ListViewUI);	//화면에 출력시키기 위한 갱신
		
		/* 올바르게 데이터가 저장되어있는지 확인하기 위한 Toast메시지 */
		//Toast.makeText(getBaseContext(), contacts.get(0).getstNm()+"/"+time, Toast.LENGTH_LONG).show();
		//time++;
	}
	
	private void setListViewHeightBasedOnChildren(ListView lv) {
		// TODO Auto-generated method stub
		ListAdapter listAdapter = lv.getAdapter();
		if(listAdapter == null){ return; }
		
		int desiredWidth = MeasureSpec.makeMeasureSpec(lv.getWidth(),
				MeasureSpec.UNSPECIFIED);
		int totalHeight = 0;
		View view = null;
		for(int i=0; i<listAdapter.getCount(); i++){
			view = listAdapter.getView(i, view, lv);
			if(i==0){ view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth,LayoutParams.WRAP_CONTENT));}
			
			view.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
			totalHeight += view.getMeasuredHeight();
			}
			ViewGroup.LayoutParams params = lv.getLayoutParams();
			params.height = totalHeight + (lv.getDividerHeight() * (lv.getCount() - 1));
			lv.setLayoutParams(params);
			lv.requestLayout();
	}
	
	//데이터 처리 쓰레드
	class XMLParser extends Thread{
		boolean mHandler = new Handler().post(new Runnable(){
		@Override
		public void run(){
			arsId = new ArrayList<String>();	//정류장ID
			stNm = new ArrayList<String>();		//정류소번호
			rtNm = new ArrayList<String>();		//버스 번호
			traTime1 = new ArrayList<String>();	//첫번째 도창예정정보
			traTime2 = new ArrayList<String>();	//두번째 도착예정정보
			
			
			String ServiceKey = "?ServiceKey=4JBUNZv1Lt67AZf1v6T3sH1hU7V3IsVmz53wg%2F%2FipCNOVxZn2X4bqhAs8Gm1%2FBVrjrYAOzE1XVOWJcKdXm5qxw%3D%3D";
			String FullURL = "http://ws.bus.go.kr/api/rest/stationinfo/getStationByUid?ServiceKey=4JBUNZv1Lt67AZf1v6T3sH1hU7V3IsVmz53wg%2F%2FipCNOVxZn2X4bqhAs8Gm1%2FBVrjrYAOzE1XVOWJcKdXm5qxw%3D%3D&arsId=";
			FullURL += BusNumber_Main;
			
			try{
				URL InputURL = new URL(FullURL);
				XmlPullParserFactory parserCreator = XmlPullParserFactory.newInstance();
				
				//XmlPullParser 사용하기 위한 생성
				XmlPullParser parser = parserCreator.newPullParser();
				parser.setInput(InputURL.openStream(), null);
				int parserEvent = parser.getEventType();
				String tag;
				boolean A=false, B=false, C=false, D=false, E=false;
				while(parserEvent != XmlPullParser.END_DOCUMENT){
					
                                        //여기서부터 XML파싱
					switch(parserEvent){
					
					case XmlPullParser.TEXT:
						tag = parser.getName();
						if(A){
							String max = parser.getText();
							arsId.add(max);
						}
						else if(B){
							String max = parser.getText();
							stNm.add(max);
						}
						else if(C){
							String max = parser.getText();
							rtNm.add(max);
						}
						else if(D){
							String max = parser.getText().toString();
							traTime1.add(max);
						}
						else if(E){
							String max = parser.getText();
							traTime2.add(max);
						}
						
						break; //첫번째 case 끝
						
						
				    case XmlPullParser.END_TAG: // 나중에
				        tag = parser.getName();
				        if (tag.compareTo("arsId") == 0) {
				        	A = false;
				        }
				        else if (tag.compareTo("rtNm") == 0) {
				        	B = false;
				        }
				        else if (tag.compareTo("stNm") == 0) {
				        	C = false;
				        }
				        else if (tag.compareTo("traTime1") == 0) {
				        	D = false;
				        }
				        else if (tag.compareTo("traTime2") == 0) {
				        	E = false;
				        }
				        break;
				        
				        
				    case XmlPullParser.START_TAG:
				        tag = parser.getName();
				        if (tag.compareTo("arsId") == 0) {
				        	A = true;
				        }
				        else if (tag.compareTo("rtNm") == 0) {
				        	B = true;
				        }
				        else if (tag.compareTo("stNm") == 0) {
				        	C = true;
				        }
				        else if (tag.compareTo("traTime1") == 0) {
				        	D = true;
				        }
				        else if (tag.compareTo("traTime2") == 0) {
				        	E = true;
				        }
				        break;
				    } //switch 끝

				    parserEvent = parser.next();

				    
				} // while 끝
			
			} //try 끝
			
			catch(Exception e){
				Log.e("Input/Error", "headerCd XmlPullParserFactory", e);
			}

			try{
				/* 파싱한 XML데이터를 contacts 배열리스트에 저장 */
				S_BusData item = new S_BusData();
				contacts = new ArrayList<S_BusData>();
				for (int loop = 0; loop < arsId.size(); loop++) {
					item.setrtNm(rtNm.get(loop));
					item.setstNm(stNm.get(loop));
					addItem(item);
				}
				Toast.makeText(getBaseContext(), "서울버스 ["+stNm.get(0)+"]를 검색합니다.", Toast.LENGTH_LONG).show();
			}
			catch(Exception e){
				Toast.makeText(getBaseContext(), "결과가 없습니다.\n정류소번호 및 정류소이름을\n확인 후 재검색바랍니다.", Toast.LENGTH_LONG).show();
				Log.e("Output/Error", "ArrayList Data Zero...", e);
			}
		}
		});
	}

	/* 리스트뷰를 맨처음 초기화 시켜주기 위한 작업 */
	public void onResume(){
		super.onResume();
		
		String stNm;
		String rtNm;
		int itemCount=2;
		for(int i=0; i<itemCount; i++){
			S_BusData item = new S_BusData();
			item.setstNm("단대오거리(구)종점");
			item.setrtNm("100성남");
			item.settraTime1("1분");
			this.addItem(item);
		}
	}
}

 

 

단순히 제가 보기엔 저 노란색글씨로 된부분이 문제인거같은데... 갱신이 안되는게 문제일까요 ?

근데 갱신이 안되는 걸 테스트해보려고 Toast로 확인했는데, 갱신될 때마다 문자가 바뀌어서 나타나요 - - ;

결국엔 ListView 출력만 안되고있는데 ... ㅠㅠㅠㅠ 도와주세요

 

어디부분을 어떻게 고쳐야하나요 ? ㅠ

폴샤 (120 포인트) 님이 2015년 2월 17일 질문
adapter 의 view 생성 부분이 불리는지 확인해보세요.

1개의 답변

0 추천
스레드와 핸들러 구조로 가시고

스레드가 끝났을때 핸들러를 호출해서

핸들러안에서 리스트뷰를 갱신해주시면 됩니다.
nicehee (73,100 포인트) 님이 2015년 2월 18일 답변
...