在Android中使用TextView获取RSS Feed行项目的值

问题描述:

我正在尝试构建一个Android应用程序,该应用程序显示几个RSS源,并且我想显示带有标题和日期的RSS源,然后获得用户点击它们查看完整的故事。目前,我将RSS行值作为其行文字视图中的意图附加值传递。然而,我不能没有TextView的故事,但仍然获得这些数据作为一个额外的意图。这里是我的代码的相关位:在Android中使用TextView获取RSS Feed行项目的值

public class RSSFeedView extends ListActivity implements OnItemClickListener 
{ 
Intent intent; 
private String thread; 

private RSSFeed feed = null; 
RSSHandler rh = new RSSHandler(); 
private MyRowAdapter myRowAdapter; 
private ArrayList<RSSItem> items; 
private final static String TAG = "MAD Assignment"; 
public String description; 

private ProgressDialog pbarDialog; 

/** Called when the activity is first created */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    intent = getIntent(); 
    thread = intent.getStringExtra("thread"); 

    StrictMode.setThreadPolicy(
    new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork() 
    // or .detectAll() for all detectable 
       .penaltyLog().build()); 

    items = new ArrayList<RSSItem>(); 
    myRowAdapter = new MyRowAdapter(this); 
    setListAdapter(myRowAdapter); 

    new DownloadFilesTask().execute(thread); 
} 


class MyRowAdapter extends ArrayAdapter<RSSItem> 
{ 
    Activity context; 

    MyRowAdapter (Activity context) 
    { 
     super(context, R.layout.rss, items); 
     this.context=context; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) 
    { 
     View row = convertView; 
     if(row == null) 
     { 
      LayoutInflater inflater = context.getLayoutInflater(); 
      row = inflater.inflate(R.layout.rss, null); 
     } 

     RSSItem _item = items.get(position); 

     TextView title = (TextView)row.findViewById(R.id.rssTitle); 
     title.setText(_item.getTitle()); 
     **TextView feed = (TextView)row.findViewById(R.id.itemlist); 
     feed.setText(_item.getDescription());** 
     //description = _item.getDescription(); TRY TO GET IT WORKING WITH JUST DATE AND TITLE!!!!!!!! 
     TextView date = (TextView)row.findViewById(R.id.rssDate); 
     String dateStr = ConvertToDate(_item.getPubDate()); 
     date.setText(dateStr); 

     row.setOnClickListener(new OnItemClickListener(position)); 

     return (row); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu (Menu menu) 
{ 
    new MenuInflater(getApplication()).inflate(R.menu.rss_menu, menu); 
    return (super.onCreateOptionsMenu(menu)); 
} 

@Override 
public boolean onOptionsItemSelected (MenuItem item) 
{ 
    switch (item.getItemId()) 
    { 
     case R.id.rss1: 
      new DownloadFilesTask().execute(thread); 
      break; 
    } 
    return super.onOptionsItemSelected(item); 
} 

private class DownloadFilesTask extends AsyncTask<String, Integer, RSSFeed> 
{ 
    @Override 
    protected RSSFeed doInBackground(String... urls) 
    { 
     // TODO Auto-generated method stub 
     feed = new RSSFeed(); 
     try 
     { 
      feed = getFeed (urls[0]); 
     } 
     catch (Exception e) 
     { 
      feed = null; 
     } 
     return feed; 
    } 

    @Override 
    protected void onCancelled() 
    { 
     // TODO Auto-generated method stub 
     super.onCancelled(); 
    } 

    @Override 
    protected void onPostExecute(RSSFeed _feed) 
    { 
     // TODO Auto-generated method stub 
     super.onPostExecute(_feed); 
     if (_feed!=null) 
     { 
      hideProgressBar(); 
      Log.v(TAG,"onPostExecute"); 
      for (RSSItem _item : _feed.getAllItems()) 
      { 
       // needed as items have to be explicitly added 
       // for notifyDataSetChanged to work 
       items.add(_item); 
      } 
      myRowAdapter.notifyDataSetChanged(); 
     } 
     else 
     { 
      showError(); 
     } 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
     showProgressBar(); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) 
    { 
     // TODO Auto-generated method stub 
     super.onProgressUpdate(values); 
    } 
} 


private RSSFeed getFeed (String urlToRssFeed) 
{ 
    try 
    { 
     URL url = new URL(urlToRssFeed); 
     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     SAXParser parser = factory.newSAXParser(); 

     XMLReader xmlreader = parser.getXMLReader(); 
     RSSHandler theRssHandler = new RSSHandler(); 

     xmlreader.setContentHandler(theRssHandler); 
     InputSource is = new InputSource(url.openStream()); 
     xmlreader.parse(is); 
     return theRssHandler.getFeed(); 
    } 
    catch (Exception e) 
    { 
     return null; 
    } 
} 

private class OnItemClickListener implements OnClickListener 
{ 
    private int mPosition; 

    OnItemClickListener(int position) 
    { 
      mPosition = position; 
    } 


    @Override 
    public void onClick(View row) 
    { 
     // TODO Auto-generated method stub 
     final String title = (String) ((TextView) row.findViewById(R.id.rssTitle)).getText(); 
     final String date = (String) ((TextView) row.findViewById(R.id.rssDate)).getText(); 
     **final String desc = (String) ((TextView) row.findViewById(R.id.itemlist)).getText();** 
     //final String desc = description; 

     Intent showDetailedIntent = new Intent(RSSFeedView.this, RSSDetailed.class); 

     showDetailedIntent.putExtra("title", title); 
     showDetailedIntent.putExtra("date", date); 
     showDetailedIntent.putExtra("desc", desc); 

     startActivity(showDetailedIntent); 
    } 
} 

@Override 
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
{ 
    // TODO Auto-generated method stub 

} 


} 

然后在我的RSSDetailed类中,我只是拉意向演员。有关如何在不首先在TextView中输出数据的情况下获取任何想法?提前致谢!

+0

你可以在你的代码中使用textview存储的东西,以及在哪里阅读它? – zapl 2012-04-22 21:32:24

+0

对不起,我还是这个网站的新手!我点击以使相关线条变粗,但他们只在两边留下了2颗星。获取值的线大约下降了三分之一,读取值的线就在底部附近。抱歉! – 2012-04-22 21:40:18

例如通过将RSSItem传递给您的侦听器。

public View getView(final int position, View convertView, ViewGroup parent) 
{ 
    row.setOnClickListener(new OnItemClickListener(position, _item)); 
} 


private class OnItemClickListener implements OnClickListener 
{ 
    private int mPosition; 
    private RSSItem mItem; 

    OnItemClickListener(int position, RSSItem item) 
    { 
      mPosition = position; 
      mItem = item; 
    } 


    @Override 
    public void onClick(View row) 
    { 
     final String title = mItem.getTitle(); 
     final String desc = mItem.getDescription(); 
     // etc.. 
    } 
} 
+0

非常感谢zapl - 一个快速和完美的解决方案! – 2012-04-22 21:55:37