2013-03-22 81 views
0

我有一个简单的应用程序,它是直接从PC世界RSS饲料这里的XML文件:ListView中显示不正确的标题

http://feeds.pcworld.com/pcworld/latestnews

我想在ListView显示标题的名称,然后当用户选择一个文章在浏览器窗口中打开。

应用程序正在运行唯一的问题是标题在ListView中没有正确显示。

应该是这样的:

让你的网站脱颖而出,与Windows 8

但取而代之的则是这样的:

[email protected]

任何想法?

这是我的MainActivity

public class MainActivity extends ListActivity { 

ArrayAdapter<Item> adapter; 
List<Item>items;//Holds item objects containing info relating to element pulled from XML file. 
Item item; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //initialize variables 
    items = new ArrayList<Item>(); 

    new PostTask().execute(); 

    adapter= new ArrayAdapter<Item>(this, android.R.layout.simple_list_item_1, items); 
    setListAdapter(adapter);   

} 

private InputStream getInputStream(URL url) { 
    try{ 
     return url.openConnection().getInputStream(); 
    }catch(IOException e){ 
     return null; 
    } 
} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    Uri uri = items.get(position).getLink(); 
    Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
    startActivity(intent); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

//ASYNC CLASS 
private class PostTask extends AsyncTask<String, Integer, String>{ 

    @Override 
    protected String doInBackground(String... arg0) { 
     try{ 
      //link to data source 
      URL url = new URL("http://feeds.pcworld.com/pcworld/latestnews"); 


      //Set up parser 
      XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
      factory.setNamespaceAware(false); 
      XmlPullParser xpp = factory.newPullParser(); 

      //get XML from input stream 
      InputStream in = getInputStream(url); 
      if (in == null) { 
       throw new Exception("Empty inputstream"); 
      } 
      xpp.setInput(in, "UTF_8"); 

      //Keep track of which tag inside of XML 
      boolean insideItem = false; 

      //Loop through the XML file and extract data required 
      int eventType = xpp.getEventType(); 

      while (eventType != XmlPullParser.END_DOCUMENT) { 

       if (eventType == XmlPullParser.START_TAG) { 
        Log.v("ENTER", String.valueOf(xpp.getEventType())); 

        if (xpp.getName().equalsIgnoreCase("item")) { 
         insideItem = true; 

         //Create new item object 
         item = new Item(); 

        } else if (xpp.getName().equalsIgnoreCase("title")) { 
         if (insideItem){ 
          item.setTitle(xpp.nextText()); 
          Log.i("title", item.getTitle()); 
         } 

        } 

        else if (xpp.getName().equalsIgnoreCase("description")) { 
         if (insideItem){ 
          item.setDescription(xpp.nextText()); 
         } 
        } 

        else if (xpp.getName().equalsIgnoreCase("link")) { 
         if (insideItem){ 
          item.setLink(Uri.parse(xpp.nextText()));        
         } 
        } 
       }else if(eventType==XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item")){ 

        insideItem=false; 
        //add item to list 
        items.add(item); 

       } 


       eventType = xpp.next(); //move to next element 
       publishProgress(); 
      } 


       } catch (MalformedURLException e) { 

        e.printStackTrace(); 

       } catch (XmlPullParserException e) { 

        e.printStackTrace(); 

       } catch (IOException e) { 

        e.printStackTrace(); 

       } 
       catch (Exception e) { 

        e.printStackTrace(); 

       } 


     return "COMPLETED"; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     adapter.notifyDataSetChanged(); 

    } 

    public void onPostExecute(String s) { 
     Toast.makeText(getApplicationContext(), s + " Items: " + items.size(), Toast.LENGTH_SHORT).show(); 
     adapter.notifyDataSetChanged(); 
    } 

} 

代码}

和用于Item

public class Item { 

//Variables 
private String title; 
private Uri link; 
private String description; 

public Item() { 
    super(); 
} 

public String getTitle() { 
    return title; 
} 
public void setTitle(String title) { 
    this.title = title; 
} 
public Uri getLink() { 
    return link; 
} 
public void setLink(Uri link) { 
    this.link = link; 
} 
public String getDescription() { 
    return description; 
} 
public void setDescription(String description) { 
    this.description = description; 
} 

}

回答

3

覆盖的toString()方法Item

@Override 
public String toString() { 
    return title; 
} 

这应该可以解决您的问题。 现在,ArrayAdapter将其视图的文本设置为Item.toString(),但这是返回Object的ID的Object的默认方法。重写它,你给它一个有意义的价值,在你的情况下标题。

+0

谢谢修复它!当我被允许时将在2分钟内接受 – Javacadabra 2013-03-22 22:19:32

-1

我认为问题在于:

else if (xpp.getName().equalsIgnoreCase("title")) { 
     if (insideItem){ 
      item.setTitle(xpp.nextText()); 
      Log.i("title", item.getTitle()); 
     } 
} 

这里,getName()是从Java Class对象的方法。你想要的方法是readContent()我想。我没有使用这个库,因此可能不完全正确,但您可以在docs中找到您需要的内容。