如何在android中解析两行文本和图像

时间:2012-07-28 19:46:35

标签: android listview xml-parsing

我有一个我正在解析的提要,并想知道如何解析两行信息和图像。我可以成功地解析一行文本,但还没有弄清楚如何从中提取图像和我想要的第二行文本。这是我想要完成的图片

example of what i want to accomplish

这是我的解析器的代码

 public class XmlPullFeedParser extends BaseFeedParser {

public XmlPullFeedParser(String feedUrl) {
    super(feedUrl);
}

public List<Message> parse() {
    List<Message> messages = null;
    XmlPullParser parser = Xml.newPullParser();
    try {
        // auto-detect the encoding from the stream
        parser.setInput(this.getInputStream(), null);
        int eventType = parser.getEventType();
        Message currentMessage = null;
        boolean done = false;
        while (eventType != XmlPullParser.END_DOCUMENT && !done){
            String name = null;
            switch (eventType){
                case XmlPullParser.START_DOCUMENT:
                    messages = new ArrayList<Message>();
                    break;
                case XmlPullParser.START_TAG:
                    name = parser.getName();
                    if (name.equalsIgnoreCase(ITEM)){
                        currentMessage = new Message();
                    } else if (currentMessage != null){
                        if (name.equalsIgnoreCase(LINK)){
                            currentMessage.setLink(parser.nextText());
                        } else if (name.equalsIgnoreCase(DESCRIPTION)){
                            currentMessage.setDescription(parser.nextText());
                        } else if (name.equalsIgnoreCase(PUB_DATE)){
                            currentMessage.setDate(parser.nextText());
                        } else if (name.equalsIgnoreCase(TITLE)){
                            currentMessage.setTitle(parser.nextText());
                        }   
                    }
                    break;
                case XmlPullParser.END_TAG:
                    name = parser.getName();
                    if (name.equalsIgnoreCase(ITEM) && currentMessage != null){
                        messages.add(currentMessage);
                    } else if (name.equalsIgnoreCase(CHANNEL)){
                        done = true;
                    }
                    break;
            }
            eventType = parser.next();
        }
    } catch (Exception e) {
        Log.e("Trey's Blog::PullFeedParser", e.getMessage(), e);
        throw new RuntimeException(e);
    }
    return messages;
}
 }

我的列表活动

 public class MessageList extends ListActivity {

private List<Message> messages;

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.activity_main);
    loadFeed(ParserType.XML_PULL);
}


@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    Intent viewMessage = new Intent(Intent.ACTION_VIEW, 
            Uri.parse(messages.get(position).getLink().toExternalForm()));
    this.startActivity(viewMessage);
}

private void loadFeed(ParserType type){
    try{
        Log.i("Trey's Blog", "ParserType="+type.name());
        FeedParser parser = FeedParserFactory.getParser(type);
        long start = System.currentTimeMillis();
        messages = parser.parse();
        long duration = System.currentTimeMillis() - start;
        Log.i("Trey's Blog", "Parser duration=" + duration);
        String xml = writeXml();
        Log.i("Trey's Blog", xml);
        List<String> titles = new ArrayList<String>(messages.size());
        for (Message msg : messages){
            titles.add(msg.getTitle());
        }
        ArrayAdapter<String> adapter = 
            new ArrayAdapter<String>(this, R.layout.row,titles);
        this.setListAdapter(adapter);
    } catch (Throwable t){
        Log.e("Trey's Blog",t.getMessage(),t);
    }
}

private String writeXml(){
    XmlSerializer serializer = Xml.newSerializer();
    StringWriter writer = new StringWriter();
    try {
        serializer.setOutput(writer);
        serializer.startDocument("UTF-8", true);
        serializer.startTag("", "messages");
        serializer.attribute("", "number", String.valueOf(messages.size()));
        for (Message msg: messages){
            serializer.startTag("", "message");
            serializer.attribute("", "date", msg.getDate());
            serializer.startTag("", "title");
            serializer.text(msg.getTitle());
            serializer.endTag("", "title");
            serializer.startTag("", "url");
            serializer.text(msg.getLink().toExternalForm());
            serializer.endTag("", "url");
            serializer.startTag("", "body");
            serializer.text(msg.getDescription());
            serializer.endTag("", "body");
            serializer.endTag("", "message");
        }
        serializer.endTag("", "messages");
        serializer.endDocument();
        return writer.toString();
    } catch (Exception e) {
        throw new RuntimeException(e);
    } 
}
 }

我的Feed解析器

 public abstract class FeedParserFactory {
static String feedUrl = "http://treymorgan.net/feed";

public static FeedParser getParser(){
    return getParser(ParserType.ANDROID_SAX);
}

public static FeedParser getParser(ParserType type){
    switch (type){
        case SAX:
            return new SaxFeedParser(feedUrl);
        case DOM:
            return new DomFeedParser(feedUrl);
        case ANDROID_SAX:
            return new AndroidSaxFeedParser(feedUrl);
        case XML_PULL:
            return new XmlPullFeedParser(feedUrl);
        default: return null;
    }
}
 }

和消息活动

 public class Message implements Comparable<Message>{
static SimpleDateFormat FORMATTER = 
    new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
private String title;
private URL link;
private String description;
private Date date;

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title.trim();
}
// getters and setters omitted for brevity 
public URL getLink() {
    return link;
}

public void setLink(String link) {
    try {
        this.link = new URL(link);
    } catch (MalformedURLException e) {
        throw new RuntimeException(e);
    }
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description.trim();
}

public String getDate() {
    return FORMATTER.format(this.date);
}

public void setDate(String date) {
    // pad the date if necessary
    while (!date.endsWith("00")){
        date += "0";
    }
    try {
        this.date = FORMATTER.parse(date.trim());
    } catch (ParseException e) {
        throw new RuntimeException(e);
    }
}

public Message copy(){
    Message copy = new Message();
    copy.title = title;
    copy.link = link;
    copy.description = description;
    copy.date = date;
    return copy;
}

@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("Title: ");
    sb.append(title);
    sb.append('\n');
    sb.append("Date: ");
    sb.append(this.getDate());
    sb.append('\n');
    sb.append("Link: ");
    sb.append(link);
    sb.append('\n');
    sb.append("Description: ");
    sb.append(description);
    return sb.toString();
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((date == null) ? 0 : date.hashCode());
    result = prime * result
            + ((description == null) ? 0 : description.hashCode());
    result = prime * result + ((link == null) ? 0 : link.hashCode());
    result = prime * result + ((title == null) ? 0 : title.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Message other = (Message) obj;
    if (date == null) {
        if (other.date != null)
            return false;
    } else if (!date.equals(other.date))
        return false;
    if (description == null) {
        if (other.description != null)
            return false;
    } else if (!description.equals(other.description))
        return false;
    if (link == null) {
        if (other.link != null)
            return false;
    } else if (!link.equals(other.link))
        return false;
    if (title == null) {
        if (other.title != null)
            return false;
    } else if (!title.equals(other.title))
        return false;
    return true;
}

public int compareTo(Message another) {
    if (another == null) return 1;
    // sort descending, most recent first
    return another.date.compareTo(date);
}
 }

我一直在研究这个问题,并且没有找到任何有效的方法。任何人都可以给予的任何信息将不胜感激。解析非常新,所以试着去学习。再次感谢。


找到了一个很棒的教程来帮助我实现我想要做的观点,这里是它的链接。

http://www.androidhive.info/2012/02/android-custom-listview-with-image-and-text/

希望这会有所帮助

1 个答案:

答案 0 :(得分:1)

您正在使用ArrayAdapter这会调整字符串数组,并在每个列表项上显示一个字符串。

你需要:

  • 创建自定义适配器
  • 延长BaseAdapter
  • 传递一个代表一个列表项的自定义布局
  • Message
  • 列表传递给您 {li}在getView()方法中检索一个Message并设置标题说明和图片

这是你的罪魁祸首:

ArrayAdapter<String> adapter =  new ArrayAdapter<String>(this, R.layout.row, titles);
this.setListAdapter(adapter);