Please Enable JavaScript!
Gon[ Enable JavaScript ]

안드로이드(Android)RSS 구현3 - RSS 피드 읽어서 ListView 로 제목 표현하기

 

환경 : Eclipse Mars, Android 4.2.2

 

이전 아티클에서 RSS 값을 읽어오는 샘플을 만들었습니다. 이번에는 TextView 에 문자열을 구성해서 보여줬던 것을 좀더 업그레이드 해서 제목을 ListView 로 표현해 보도록 합니다

 

안드로이드(Android)RSS 구현3 - RSS 피드 읽어서 ListView 로 제목 표현하기

 

이번 예제를 구현하기 위해 xml 이 두개가 필요합니다. 하나의 행을 나타내는 xml 과 메인 activity 구성하는 레이아웃 xml 입니다. 첫번째 메인 레이아웃을 구성하는 xml 전체 내용입니다.

 

activity_xml_rss_title_list_view.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="안드로이드 RSS 피드 값을 ListView 로 표현하기" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@android:id/empty"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="No Data" />

</LinearLayout>

 

두번째 리스트뷰에서 한행을 나타내는 xml 레이아웃 입니다. 이곳에 폰트크기나 행의 높이를 조절하시면 됩니다.

 

rss.xml


<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rowtext"
    android:layout_width="fill_parent"
    android:layout_height="30px"
    android:textSize="10sp" />

 

리스트뷰를 간단하게 구현하기 위해 ListActivity 를 상속받아 Activity 를 구현해야 합니다. 그리고 ListActivity 에서 지원하는 setListAdapter() 에 인수값으로 List<String> item 리스트객체를 넘기면 됩니다.

 

private void setListView(){
	ArrayAdapter<String> itemList = new ArrayAdapter<String>(
this,
 R.layout.rsslist, 
item);
	setListAdapter(itemList);
}

 

리스트 값을 셋팅하는 setListView() 함수를 호출하는 곳은 AsyncTask 가 완료되면 호출되는 함수 onPostExecute() 입니다.

 

@Override
protected void onPostExecute(Void result) {
	setListView();
	super.onPostExecute(result);
}

 

그리고 리스트를 만들기위해 setListAdapter() 에 인수로 들어가는 리스트값, RSS 를 읽어온 제목들이 들어있는 리스트객체는 어디서 구현하냐? RSS 분석할려고 만든 클래스인 RSSHandler 에서 합니다. characters() 요소에 값을 읽어오는 함수 인데 현재 읽어온 값의 상태값이 타이틀인지 판단해서 맞다면 List 에 저장하는 것이죠. int com.example.samplebooksearchapi.XmlRssTitleListView.RSSHandler.stateTitle

 

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
	String strCharacters = new String(ch, start, length);
	if (state == stateTitle) {
		item.add(strCharacters);
	}
}

 

지금까지의 내용에 대한 전체 메인 activity 에 대한 소스입니다.


import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

import android.app.ListActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class XmlRssTitleListView extends ListActivity {

	String streamTitle = "";
	private TextView mResult;
	private List<String> item = new ArrayList<String>();
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_xml_rss_title_list_view);

		ProcessXmlTask xmlTask = new ProcessXmlTask();
		xmlTask.execute("http://mainia.tistory.com/rss");
	}

	private void setListView(){
		ArrayAdapter<String> itemList = new ArrayAdapter<String>(this, R.layout.rsslist, item);
		setListAdapter(itemList);
	}
	
	// AsyncTask<Params,Progress,Result>
	private class ProcessXmlTask extends AsyncTask<String, Void, Void> {
		
		protected Void doInBackground(String... urls) {
			try {
				
				URL rssUrl = new URL(urls[0]);
				SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
				SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
				XMLReader myXMLReader = mySAXParser.getXMLReader();
				RSSHandler myRSSHandler = new RSSHandler();
				myXMLReader.setContentHandler(myRSSHandler);
				InputSource myInputSource = new InputSource(rssUrl.openStream());
				myXMLReader.parse(myInputSource);

			} catch (MalformedURLException e) {
				e.printStackTrace();
				mResult.setText("Cannot connect RSS!");
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
				mResult.setText("Cannot connect RSS!");
			} catch (SAXException e) {
				e.printStackTrace();
				mResult.setText("Cannot connect RSS!");
			} catch (IOException e) {
				e.printStackTrace();
				mResult.setText("Cannot connect RSS!");
			}
			return null;
		}
		
		@Override
		protected void onPostExecute(Void result) {
			setListView();
			super.onPostExecute(result);
		}
	}

	private class RSSHandler extends DefaultHandler {
		final int stateUnknown = 0;
		final int stateTitle = 1;
		int state = stateUnknown;

		int numberOfTitle = 0;
		String strTitle = "";
		String strElement = "";

		@Override
		public void startDocument() throws SAXException {
			strTitle = "--- Start Document ---\n";
		}

		@Override
		public void endDocument() throws SAXException {
			strTitle += "--- End Document ---";
			streamTitle = "Number Of Title: " + String.valueOf(numberOfTitle) + "\n" + strTitle;
		}

		@Override
		public void startElement(String uri, 
								 String localName, 
								 String qName, 
								 Attributes attributes)
								 
				throws SAXException {
			if (localName.equalsIgnoreCase("title")) {
				state = stateTitle;
				strElement = "Title: ";
				numberOfTitle++;
			} else {
				state = stateUnknown;
			}
		}

		@Override
		public void endElement(String uri, String localName, String qName) 
				throws SAXException {
			
			if (localName.equalsIgnoreCase("title")) {
				strTitle += strElement + "\n";
			}
			state = stateUnknown;
		}

		@Override
		public void characters(char[] ch, int start, int length) throws SAXException {
			String strCharacters = new String(ch, start, length);
			if (state == stateTitle) {
				item.add(strCharacters);
			}
		}
	}
}
Posted by 녹두장군

댓글을 달아 주세요