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

파싱후 리스트로 출력하는부분이 안됩니다....

0 추천
package com.example.jeonjuintroduce;
 
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Vector;
 
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
 
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
 
public class Activity_culture extends ListActivity{
 
static String dataTitle ="dataTitle" ;
static String dataContent ="dataContent";
static String tmpField4 ="tmpField4";
static int index = 0;
URL newURL;
String tagName ="";
 
HashMap<String, String> map;
ArrayList<HashMap<String, String>> arraylist = new ArrayList<HashMap<String, String>>();
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.page1);
new ProgressTask(Activity_culture.this).execute();
 
ArrayAdapter<HashMap<String, String>> listAD = new ArrayAdapter<HashMap<String, String>>(Activity_culture.this, R.layout.page1, arraylist);
lv = (ListView)findViewById(android.R.id.list);
lv.setAdapter(listAD);
 
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
 
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) 
{
// TODO Auto-generated method stub
Intent intent = new Intent(Activity_culture.this , Activity_detail.class);
startActivity(intent);
}
});
 
}
 
private class ProgressTask extends AsyncTask<String, Void, Boolean> {
private ProgressDialog dialog;
public ProgressTask(ListActivity activity) {
Log.i("1", "Called");
context = activity;
dialog = new ProgressDialog(context);
}
private Context context;
protected void onPreExecute() {
this.dialog.setMessage("잠시만 기다려주세요.");
this.dialog.show();
}
@Override
protected void onPostExecute(final Boolean success) {
if (dialog.isShowing()) {
dialog.dismiss();
}
 
ListAdapter adapter = new SimpleAdapter(context, arraylist, R.layout.page2, new String[] {dataTitle, dataContent
,tmpField4}, new int[] { R.id.titletxt,  R.id.menutxt1 , R.id.addresstxt1});
setListAdapter(adapter);
lv = getListView();
////////////밑줄 빨강색
lv.setDivider(new ColorDrawable(Color.RED));
lv.setDividerHeight(5);
 
 
}
 
 
 
 
protected Boolean doInBackground(final String... args) {
// TODO Auto-generated method stub
 
try{
//uri에 저장된 사이트에 접속
 
map = new HashMap<String, String>();
newURL = new URL(url);
 
//xml데이터를 읽어서 inputstream에 접속
InputStream in = newURL.openStream();
 
//xmlpullparser를 사용하기 위해 
 
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
 
//네임스페이스 사용여부
 
factory.setNamespaceAware(true);
 
XmlPullParser xpp = factory.newPullParser();
 
xpp.setInput(in , "UTF-8");
 
//이벤트 저장할 변수 선언
int eventType = xpp.getEventType();
 
boolean isItemTag = false;
 
//xml의 데이터의 끝까지 돌면서 원하는 데이터를 얻어옴
 
while(eventType != XmlPullParser.END_DOCUMENT)
{
 
if( eventType == XmlPullParser.START_TAG) //시작 태그를 만났을떄
{
 
//태그명 저장
tagName = xpp.getName();
if(tagName.equals("list"))
isItemTag = true;
 
}
 
else if(eventType == XmlPullParser.TEXT)//내용
{
 
 
//tagname에 저장된 태그명 title 태그일때 제목을 저장
if(isItemTag ==true && tagName.equals("dataTitle"))
{
 
map.put(dataTitle, xpp.getText());
 
Log.i("News App",dataTitle);
}
//기사의 내용을 저장
 
if(isItemTag ==true && tagName.equals("dataContent"))
 
map.put(dataContent,xpp.getText());
 
 
Log.e("News App","e =>"+dataContent);
 
if(isItemTag == true && tagName.equals("tmpField4"))
map.put(tmpField4, xpp.getText());
Log.e("News App","a =>"+tmpField4);
}
 
else if(eventType == XmlPullParser.END_TAG)//닫는 태그를 만났을때
{
tagName = xpp.getName();
 
if(tagName.equals("viewCount"))
{
 
arraylist.add(map);
 
 
}
 
eventType = xpp.next();
 
}
 
catch(Exception e)
{
e.printStackTrace();
}
 
return null;
}
 
 
 
}
 
 
 
}
 
공공api를 통해서 가게리스트를 출력해주는거 만들고있는데요...
 
xmlpullparser 사용해서 title과 content 부분 그리고 tmpfield라는 주소부분 가져왔는데
 
출력해보면 가게 하나가 리스트에 여러개 찍히고 끝나네요..ㅠㅠ
 
이렇게 하면 될꺼같았는데 뭐가 문제인지 ..ㅠㅠ 많은 가르침 부탁드립니다..ㅠ
 
 
 
 
익명사용자 님이 2013년 12월 20일 질문

1개의 답변

0 추천
 
if( eventType == XmlPullParser.START_TAG) //시작 태그를 만났을떄
{
//태그명 저장
tagName = xpp.getName();
if(tagName.equals("list"))
isItemTag = true;
map = new HashMap<String, String>();
}
 
arraylist를 add하신 후 map을 새로 생성하셔야 합니다.
기존 맵에 새로운 데이터를 업데이트하고, 리스트는 계속 같은 맵객체를 참조하기 때문에
마지막에 넣은 데이터만 리스트에 쭉 출력되겠네요.

 

 

코딩인헬 (12,150 포인트) 님이 2013년 12월 20일 답변
코딩인헬님이 2013년 12월 20일 수정
ㅠㅠ 시작태그 만나는 부분에 map을 새로 만들었더니
아예 리스트에 값이 출력인 안되고 빈 리스트만 출력되네요 ㅠㅠ
혹시
if(tagName.equals("list")){
isItemTag = true;
map = new HashMap<String, String>();
}
이 If 구문 밖에서 맵을 생성하셨나요.
xml형식이 제생각이 맞다면
<list>
<dataTitle></dataTitle>
<dataContent></dataContent>
<viewCount></viewCount>
</list>
이런 형식의 XML이라면
<list>구문을 파싱할때 맵을 생성하고,
</list>구문을 파싱할때 리스트에 맵을 추가하시면 문제없을겁니다.
...