Android-datumindeling in ListView

Dankzij Giulio Piancastelli heb ik nu een lijstweergave met meerdere lijnmogelijkheden. Nu heb ik een probleem met het formatteren van de datum op de tweede regel. Alle datums zijn hetzelfde. In de feed zijn ze anders. Ik heb iemand nodig die me helpt bij het indelen van mijn datums in het formaat Dag, Maand, Jaar (donderdag, 27 oktober 2011).

Dit is de code die niet werkt :

 List> data = new ArrayList>(); for (RSSItem item : feed.getAllItems()) { Map datum = new HashMap(2); datum.put("title", item.getTitle()); String dateStr = item.getPubDate(); SimpleDateFormat curFormater = new SimpleDateFormat("EEEE, MMMM dd, yyyy"); Date dateObj = new Date(); try { dateObj = curFormater.parse(dateStr); } catch (ParseException e) { //TODO Auto-generated catch block e.printStackTrace(); } SimpleDateFormat postFormater = new SimpleDateFormat("EEEE, MMMM dd, yyyy"); String newDateStr = postFormater.format(dateObj); datum.put("date", newDateStr); data.add(datum); } SimpleAdapter adapter = new SimpleAdapter(this, data, android.R.layout.simple_list_item_2, new String[] {"title", "date"}, new int[] {android.R.id.text1, android.R.id.text2}); itemlist.setAdapter(adapter); itemlist.setOnItemClickListener(this); itemlist.setSelection(0); 

Repeating date

Als ik mijn vorige datumcode verwijder, werkt deze prima, maar is deze onjuist geformatteerd.

Deze code werkt wel, maar is niet correct geformatteerd :

List> data = new ArrayList>(); for (RSSItem item : feed.getAllItems()) { Map datum = new HashMap(2); datum.put("title", item.getTitle()); datum.put("date", item.getPubDate().toString()); data.add(datum); } SimpleAdapter adapter = new SimpleAdapter(this, data, android.R.layout.simple_list_item_2, new String[] {"title", "date"}, new int[] {android.R.id.text1, android.R.id.text2}); itemlist.setAdapter(adapter); itemlist.setOnItemClickListener(this); itemlist.setSelection(0); 

incorrect date format

Ik heb iemand nodig die me helpt bij het indelen van mijn datums in het formaat Dag, Maand, Jaar (donderdag, 27 oktober 2011). Dank je!

3
Dus eigenlijk wil je van het 12:00:00 GMT gedeelte af?
toegevoegd de auteur coder_For_Life22, de bron
Oké, ik zie ... Dit betekent dat er een probleem is met hoe je de gegevens parseert en instelt op variabelen en deze instelt op TextView in de lijstweergave.
toegevoegd de auteur coder_For_Life22, de bron
Ik zou willen voorstellen om te loggen wat je DATE variabele is en om te zien wat de resultaten voor elke zijn. Zet het in je lus of wat je ook gebruikt, voer de lijstweergave in.
toegevoegd de auteur coder_For_Life22, de bron
@CKallemeres: ik vermoed sterk dat in het logboek van de code die de eerste screenshot maakt, er een stacktracering is voor elk item. U moet leren de diagnostische hulpmiddelen te gebruiken die voor u beschikbaar zijn - in feite mislukt de paring omdat u het verkeerde formaat gebruikt. Als je dat zou opmerken, zou je de reikwijdte van waar we zouden moeten kijken aanzienlijk verkleinen.
toegevoegd de auteur Jon Skeet, de bron
Is het niet wat je wenst wat we zien in de eerste screenshot?
toegevoegd de auteur nicholas.hauschild, de bron
Dus je wilt het formaat van de eerste, maar alle datums moeten anders zijn?
toegevoegd de auteur nicholas.hauschild, de bron
Ik wil dat de datum Dag, Maand, Jaar leest. Zoals dit: donderdag 27 oktober 2011
toegevoegd de auteur Courtney Stephenson, de bron
Elke datum leest hetzelfde in de eerste screenshot. In de feed die de klas aan het lezen is, is deze niet voor elk item hetzelfde, zoals wordt weergegeven in de tweede schermafbeelding.
toegevoegd de auteur Courtney Stephenson, de bron

2 antwoord

Het probleem is dat u de tekenreeks < probeert te ontleden met hetzelfde patroon dat u later gebruikt voor indeling . Je zou het moeten ontleden met het patroon dat het al bevat, wat lijkt op "vr, 21 okt 2011 12:00:00 GMT" blijkbaar.

Dus ik vermoed dat je zoiets als wilt:

// You probably actually want to set the time zone of the
// formatting pattern - but you'll need to think what time zone you
// really want. We don't know enough to say. Ditto the locale...
private static final DateFormat PARSING_PATTERN = 
    new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US); 
private static final DateFormat FORMATTING_PATTERN = 
    new SimpleDateFormat("EEEE, MMMM dd, yyyy"); 

...

for (RSSItem item : feed.getAllItems()) {
    Map datum = new HashMap(2);
    datum.put("title", item.getTitle());

    String outputDate;
    try {
       Date date = PARSING_PATTERN.parse(item.getPubDate());
       outputDate = FORMATTING_PATTERN.format(date);
    } catch (ParseException e) {
       outputDate = "Invalid date";//Or whatever...
    } 
    datum.put("date", outputDate);
    data.add(datum);
}
4
toegevoegd
@CKallemeres: Wacht even - ik heb net gezien dat ik te veel komma's had. Probeer nu - Ik heb het ontleedpatroon enigszins gewijzigd.
toegevoegd de auteur Jon Skeet, de bron
@CKallemeres: Oké, ik heb het opnieuw bewerkt - om de VS-locale expliciet te gebruiken en de dag- en maandvolgorde vast te leggen. Maar je had eigenlijk zelf moeten kunnen werken, om eerlijk te zijn - Stack Overflow is een helpende hand; je moet de oplossing begrijpen zodat je er zelf mee kunt werken. Begrijpt u de code die ik heb gepresenteerd? Begrijpt u dat de PARSING_PATTERN moet overeenkomen met uw invoergegevens?
toegevoegd de auteur Jon Skeet, de bron
@CKallemeres: Begrijpt u het nu? U probeert het van één patroon te wijzigen (bijvoorbeeld "Do, 27 okt 11 2011 GMT") in een ander patroon (bijvoorbeeld "donderdag, 27 oktober 2011")
toegevoegd de auteur Jon Skeet, de bron
Ik raak nu elke keer de catch-verklaring aan. Hoe los ik dit probleem op?
toegevoegd de auteur Courtney Stephenson, de bron
Het gebeurt nog steeds.
toegevoegd de auteur Courtney Stephenson, de bron
Ik begin te begrijpen hoe de code werkt. Ik ben nieuw in programmeren en deze site is de beste die ik kon vinden om te begrijpen hoe dingen werken. Het deel dat me in de war bracht, is waarom PARSING_PATTERN anders moet zijn dan FORMATTING_PATTERN.
toegevoegd de auteur Courtney Stephenson, de bron
Ik begrijp het nu. Bedankt dat je geduldig met me bent en me wilt helpen begrijpen waarom dit werkt.
toegevoegd de auteur Courtney Stephenson, de bron

EDIT:

U moet deze regel wijzigen:

SimpleDateFormat curFormater = new SimpleDateFormat("EEEE, MMMM dd, yyyy");

Bekijk de indelingen die beschikbaar zijn voor SimpleDateFormat . Waar u het naar wijzigt, is afhankelijk van het formaat dat wordt geretourneerd uit de RSS-feed die u gebruikt.

Nou, vandaag is donderdag 27 oktober 2011. Ik denk dat er een ParseException aan het gebeuren is, en omdat je het niet aan het verwerken bent, blijft je dateObj ingesteld naar nieuwe datum() , die op dit moment is.

Het patroon dat u aan het lezen bent is waarschijnlijk onjuist. (Het is eigenlijk hetzelfde als het formaat dat u wilt uitvoeren, dus het lijkt zinloos zoals het is.) Bekijk het patroon dat binnenkomt via de RSS-feed en herevalueer het patroon dat u gebruikt om in een Datum -object.

U wilt waarschijnlijk ook een RuntimeException weggooien als de parsering mislukt en de ParseException niet doorslikt.

    try {
        dateObj = curFormater.parse(dateStr);
    } catch (ParseException e) {
        throw new RuntimeException("Couldn't parse dateStr: " + dateStr);
    } 
1
toegevoegd
Hoe los ik dit op?
toegevoegd de auteur Courtney Stephenson, de bron