web-dev-qa-db-fra.com

Ajout du texte de sous-élément ListView dans Android

J'ai créé un lecteur RSS qui répertorie les éléments dans une vue de liste. Je veux également une date en dessous de chaque élément, mais je ne sais pas comment faire. J'ai besoin de l'aide de quelqu'un pour que le texte du sous-élément affiche la date de publication qui a été extraite du flux RSS.

Voici le code que j'ai pour ma classe:

public class RSSReader extends Activity implements OnItemClickListener
{
    public final String RSSFEEDOFCHOICE = "http://app.calvaryccm.com/mobile/Android/v1/devos";

    public final String tag = "RSSReader";
    private RSSFeed feed = null;

    /** Called when the activity is first created. */

    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);

        // go get our feed!
        feed = getFeed(RSSFEEDOFCHOICE);

        // display UI
        UpdateDisplay();
    }

    private RSSFeed getFeed(String urlToRssFeed)
    {
        try
        {
            // setup the url
           URL url = new URL(urlToRssFeed);

           // create the factory
           SAXParserFactory factory = SAXParserFactory.newInstance();
           // create a parser
           SAXParser parser = factory.newSAXParser();

           // create the reader (scanner)
           XMLReader xmlreader = parser.getXMLReader();
           // instantiate our handler
           RSSHandler theRssHandler = new RSSHandler();
           // assign our handler
           xmlreader.setContentHandler(theRssHandler);
           // get our data via the url class
           InputSource is = new InputSource(url.openStream());
           // perform the synchronous parse           
           xmlreader.parse(is);
           // get the results - should be a fully populated RSSFeed instance, or null on error
           return theRssHandler.getFeed();
        }
        catch (Exception ee)
        {
            // if we have a problem, simply return null
            System.out.println(ee.getMessage());
            System.out.println(ee.getStackTrace());
            System.out.println(ee.getCause());
            return null;
        }
    }
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        super.onCreateOptionsMenu(menu);
        menu.add(Menu.NONE, 0, 0, "Refresh");
        Log.i(tag,"onCreateOptionsMenu");
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item){
        switch (item.getItemId()) {
        case 0:

            Log.i(tag,"Set RSS Feed");
            return true;
        case 1:
            Log.i(tag,"Refreshing RSS Feed");
            return true;
        }
        return false;
    }

    private void UpdateDisplay()
    {
        TextView feedtitle = (TextView) findViewById(R.id.feedtitle);
        TextView feedpubdate = (TextView) findViewById(R.id.feedpubdate);
        ListView itemlist = (ListView) findViewById(R.id.itemlist);


        if (feed == null)
        {
            feedtitle.setText("No RSS Feed Available");
            return;
        }

        if(feedtitle != null)
            feedtitle.setText(feed.getTitle());
        if(feedpubdate != null)
            feedpubdate.setText(feed.getPubDate());


        ArrayAdapter<RSSItem> adapter = new ArrayAdapter<RSSItem>(this,Android.R.layout.simple_list_item_1,feed.getAllItems());

        itemlist.setAdapter(adapter);

        itemlist.setOnItemClickListener(this);

        itemlist.setSelection(0);
    }

    @Override
    public void onItemClick(AdapterView parent, View v, int position, long id)
    {
        //Log.i(tag,"item clicked! [" + feed.getItem(position).getTitle() + "]");       

        Intent itemintent = new Intent(this,ShowDescription.class);

        Bundle b = new Bundle();
        b.putString("title", feed.getItem(position).getTitle());
        b.putString("description", feed.getItem(position).getDescription());
        b.putString("link", feed.getItem(position).getLink());
        b.putString("pubdate", feed.getItem(position).getPubDate());

        itemintent.putExtra("Android.intent.extra.INTENT", b);

        startActivity(itemintent);
    }
}

Voici mon XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent">
 <TextView  
Android:layout_width="fill_parent" 
Android:layout_height="wrap_content" 
Android:text="Android RSSReader"
Android:id="@+id/feedtitle"/>
<TextView  
Android:layout_width="fill_parent" 
Android:layout_height="wrap_content" 
Android:text=""
Android:id="@+id/feedpubdate"/>
<ListView
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:id="@+id/itemlist"

Android:fastScrollEnabled="true"/>    
 </LinearLayout>

Voici à quoi cela ressemble maintenant dans Eclipse:

ListView Currently

Voici à quoi cela ressemble de courir:

In Process

Comment faire pour que le texte du sous-élément affiche la date de publication qui a été extraite du flux RSS?

34

Vous devriez avoir un fichier item_list.xml comme celui-ci:

    <RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:padding="6dp" >

    <TextView
        Android:id="@+id/page_title"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:textColor="#D8000000"
        Android:textSize="16sp"
        Android:textStyle="bold" />

    <TextView
        Android:id="@+id/page_date"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_below="@id/page_title"
        Android:ellipsize="Marquee"
        Android:lines="3"
        Android:marqueeRepeatLimit="Marquee_forever"
        Android:textColor="#D8000000"
        Android:textSize="12sp" />

</RelativeLayout>

et dans votre listadapter dans la méthode getview:

View row = convertView;
LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
row = inflater.inflate(R.layout.item_list, parent, false);

TextView listTitle = (TextView) row.findViewById(R.id.page_title);
 listTitle.setText(title);

TextView date = (TextView) row.findViewById(R.id.page_date); 
date.setText( <here put your date from RSS feed>);

return row;

cela devrait le faire!

5
Iulia Barbu

Étant donné que vous souhaitez mapper plusieurs éléments de données à plusieurs vues, vous ne pouvez pas utiliser un ArrayAdapter. Vous devrez utiliser un SimpleAdapter à la place.

De plus, j'ai remarqué que vous obtenez le flux RSS sur le fil principal de l'interface utilisateur. Cela va entraîner une non-réponse de votre application. Si vous ne savez pas de quoi je parle, jetez un coup d'œil à l'article Filetage indolore (je considère que c'est une lecture incontournable pour tout développeur Android développeur). Ce que vous devez faire à la place est d'utiliser un Loader . Ils ont été conçus pour exactement votre type de situation. Bien qu'ils n'aient été introduits qu'après API-10, vous pouvez toujours les utiliser à des niveaux d'API inférieurs via le - Support Package .

1
Kurtis Nusbaum
0
Rakon_188