|
안드로이드(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 |

