안드로이드(Android)RSS 구현3 - RSS 피드 읽어서 ListView 로 제목 표현하기 |
환경 : Eclipse Mars, Android 4.2.2 |
이전 아티클에서 RSS 값을 읽어오는 샘플을 만들었습니다. 이번에는 TextView 에 문자열을 구성해서 보여줬던 것을 좀더 업그레이드 해서 제목을 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); } } } }
'안드로이드 개발' 카테고리의 다른 글
안드로이드(Android) onDraw 함수를 이용해 화면에 비트맵이미지, 도형 그리기 (0) | 2014.11.27 |
---|---|
안드로이드(Android) 코드경고 – Avoid object allocations during draw/layout operations (preallocate and reuse instead) 해제 하기 (0) | 2014.11.26 |
안드로이드(Android) RSS 구현5 - RSS 제목별 상세내용 구현 (1) | 2014.11.25 |
안드로이드(Android) RSS 구현4 - RSS 피드 구현 제목,타이틀등 상세 구현 (0) | 2014.11.24 |
안드로이드(Android) RSS 구현2 - XML 파싱클래스를 이용해서 RSS Reader 구현하기 (5) | 2014.11.22 |
안드로이드(Android) RSS 구현1 - XmlResourceParser 를 이용하여 XML 파싱하기 (0) | 2014.11.21 |
안드로이드(Android) Java 코드에서 색깔값 화면에 입히기 (0) | 2014.11.20 |
안드로이드(Android) 색깔을 xml 로 정의 하고 관리하기 (0) | 2014.11.19 |