adnroid用のニュースアプリを作成しようとしています。サイトから RSS を解析します。今は200点ありますが、将来的には2000点以上になります。このチュートリアルを使用して、画像とテキストを含む ListView を作成します。 http://www.androidhive.info/2012/02/android-custom-listview-with-image-and-text/
しかし、私は別のパーサーを使用しています。
私が抱えている問題は、s - xml file load full. I
10〜15個のアイテムで部分的にロードおよび解析する方法を検索することです。
たとえば、最初に 10 項目を読み込み、ユーザーが下にスクロールして、次の 10 項目を読み込みます。このパーサーでそれを行うことは可能ですか、それとも他のものを使用する必要がありますか: JSON など/?
コード: 主な活動:
private NewsParser parser;
private List<PostItem> messages;
parser = new NewsParser();
messages = parser.parse();
ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();
try
{
for (PostItem msg : messages){
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put("Date", msg.getDate());
map.put("Title", msg.getTitle());
map.put("Description", msg.getDescription());
map.put("imgUrl", msg.getImgUrl());
// adding HashList to ArrayList
menuItems.add(map);
}
}
catch(Exception e)
{
e.printStackTrace();
}
return menuItems;
ニュースパーサー:
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import android.sax.Element;
import android.sax.EndElementListener;
import android.sax.EndTextElementListener;
import android.sax.RootElement;
import android.util.Xml;
public class NewsParser {
/**
* We transfer the address bar of RSS feeds in the URL, connect to the server at that address
* and receive the data stream from the RSS feed.
* @return
*/
protected InputStream getInputStream() {
URL feedUrl = null;
try {
feedUrl = new URL("http://www.mysite.com/test_xml");
} catch (MalformedURLException e1) {
e1.printStackTrace();
}
try {
return feedUrl.openConnection().getInputStream();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* Parser XML
* @return List<PostItem>
*/
public List<PostItem> parse() {
final PostItem currentPost = new PostItem();
final List<PostItem> messages = new ArrayList<PostItem>();
RootElement root = new RootElement("rss");
Element channel = root.getChild("channel");
Element item = channel.getChild("item");
item.setEndElementListener(new EndElementListener(){
public void end() {
messages.add(currentPost.copy());
}
});
item.getChild("title").setEndTextElementListener(new EndTextElementListener(){
public void end(String body) {
currentPost.setTitle(body);
}
});
item.getChild("link").setEndTextElementListener(new EndTextElementListener(){
public void end(String body) {
currentPost.setLink(body);
}
});
item.getChild("description").setEndTextElementListener(new EndTextElementListener(){
public void end(String body) {
currentPost.setDescription(body);
}
});
item.getChild("pubDate").setEndTextElementListener(new EndTextElementListener(){
public void end(String body) {
currentPost.setDate(body);
}
});
item.getChild("imgUrl").setEndTextElementListener(new EndTextElementListener(){
public void end(String body) {
currentPost.setImgUrl(body);
}
});
item.getChild("imgUrlBig").setEndTextElementListener(new EndTextElementListener(){
public void end(String body) {
currentPost.setImgUrlBig(body);
}
});
try {
Xml.parse(this.getInputStream(), Xml.Encoding.UTF_8, root.getContentHandler());
} catch (Exception e) {
throw new RuntimeException(e);
}
return messages;
}
}
ポストアイテム:
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class PostItem {
static SimpleDateFormat FORMATTER = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss Z", Locale.US);
static SimpleDateFormat OUT_FORMATTER = new SimpleDateFormat("dd.MM.yyyy", Locale.US);
private String title;
private URL link;
private String linkText;
private String description;
private Date date;
private String imgUrl;
private String imgUrlBig;
/**
* Setter для title
* @param title
*/
public void setTitle(String title) {
this.title = title.trim();
}
/**
* Getter для title
* @return
*/
public String getTitle() {
return title;
}
/**
* Setter для description
* @param description
*/
public void setDescription(String description) {
this.description = description.trim();
}
/**
* Getter для description
* @return
*/
public String getDescription() {
return description;
}
/**
* Setter для link и linkText
* @param link
*/
public void setLink(String link) {
this.linkText = link.trim();
try {
this.link = new URL(link);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
/**
* Getter для link
* @return
*/
public URL getLink() {
return link;
}
/**
* Getter для linkText
* @return
*/
public String getLinkText() {
return linkText;
}
/**
* Setter для date
* @param date
*/
public void setDate(String date) {
try {
this.date = FORMATTER.parse(date.trim());
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
* Getter для date
* @return
*/
public String getDate() {
return OUT_FORMATTER.format(this.date);
}
/**
* Setter для imgUrl
* @param imgUrl
*/
public void setImgUrl(String imgUrl) {
this.imgUrl = imgUrl.trim();
}
/**
* Getter для imgUrl
* @return
*/
public String getImgUrl() {
return imgUrl;
}
/**
* Setter для imgUrlBig
* @param imgUrl
*/
public void setImgUrlBig(String imgUrlBig) {
this.imgUrlBig = imgUrlBig.trim();
}
/**
* Getter для imgUrlBig
* @return
*/
public String getImgUrlBig() {
return imgUrlBig;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(linkText);
return sb.toString();
}
public PostItem copy() {
PostItem copy = new PostItem();
copy.title = title;
copy.link = link;
copy.linkText = linkText;
copy.description = description;
copy.date = date;
copy.imgUrl = imgUrl;
copy.imgUrlBig = imgUrlBig;
return copy;
}
}