[Android] ListView met WebView in rijen - volgorde veranderd

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Hoi,

Ik ben een Android app aan het schrijven voor een forum. Mijn app haalt de HTML source van een forum pagina (bijvoorbeeld een thread) op, parsed de benodigde informatie hier uit en toont dit dan in een ListView in een ListActivity.

Voor elke rij in mijn ListView (== elke post in de thread) heb ik een aparte 'postrow.xml' layout file. Die bevat onder andere een TextView voor de auteur en een WebView voor de html text in de post (de 'contents' van de post). Ik gebruik dan een custom ArrayAdapter om de ListView te vullen, waar ik getView override als volgt:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class PostListAdapter extends ArrayAdapter<Post>
{
        @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View v = convertView;
        if (v == null)
        {
            LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.postrow, null);
        }
        
        Post post = items.get(position);
        if (post != null)
        {           
            TextView lblAuthor = (TextView) v.findViewById(R.id.lblAuthor);
            WebView webContents = (WebView) v.findViewById(R.id.webContents);
            
            lblAuthor.setText(post.Author);     
            this.setWebviewHtml(webContents, post);
        }
        return v;
    }

    private String htmlPreamble = "<html><head><style type=\"text/css\">blockquote {color: #555555; margin: 10px; overflow:hidden; padding: 10px; border-left: 1px solid #dadada; border-top: 1px solid #dadada;} blockquote cite { display:block; font-weight:bold;} blockquote.uncited { padding-top:15px;}</style></head><body>";
    private String htmlPostamble = "</body></html>";
    
    private void setWebviewHtml(WebView view, Post post)
    {
        String html = htmlPreamble + post.Contents + htmlPostamble;
        view.loadData(html, "text/html", null);
    }
}

Ik kijk dus eerst of de View null is, en als dat zo maak ik een nieuwe View dmv inflate, en geef ik aan dat ik de postrow layout wil gebruiken.

Daarna haal ik de TextView voor de auteur en de WebView voor de contents op, en zet ik de juiste informatie daar in. De contents van een post (post.Contents) zijn in HTML formaat maar bevatten enkel wat simpele tags zoals <b>, <img> en <blockquote>, dat werkt allemaal prima. Ik zet er een <html><body> ... </body></html> tags omheen, en om de blockquotes wat netter weer te geven zet ik er nog een stukje CSS in. Volgens mij is dit allemaal niet zo relevant.


Anyway, als ik nu mijn app draai dan lijkt het eerst helemaal goed te werken. Ik krijg netjes een lijst met posts, de auteur klopt en de contents van de post kloppen ook. Zelfs de blockquotes krijgen de stijl die ik aangeef in de CSS dus het werkt allemaal perfect.

Tot ik ga scrollen... Zodra ik ga scrollen lijken de posts een beetje random door elkaar te gaan schuiven. Vreemd genoeg blijven de auteurs wel altijd in de juiste volgorde, enkel de contents kloppen niet meer. Als ik gewoon rustig omlaag scroll kom ik vroeg of laat weer de eerste post tegen (enkel nu met een heel andere auteur), om een of andere reden laadt hij dus de verkeerde post in de WebView...

Nu heb ik even gegoogled, en standaard lijkt het probleem te zijn dat men de text in de TextViews (bijvoorbeeld) alleen zet als de View null was (dus eigenlijk alleen de eerste keer):
http://stackoverflow.com/...s-mixed-up-when-scrolling
http://stackoverflow.com/...ut-of-order-when-scrolled

Het advies is dan ook altijd om het zetten van de waardes buiten de "if view == null" check te doen. Maar dat doe ik al!

Daarna heb ik geprobeerd om de WebView te vervangen door een simpele TextView, en gewoon de raw HTML weer te geven. Nu werkt het wel prima! De posts veranderen niet meer van volgorde, alles klopt gewoon.


Kan het zijn dat de WebView op een of andere manier zijn html wil cachen en daar soms de mist in gaat? Ik snap er even weinig van... Waarschijnlijk doe ik zelf iets fout, ik ben vrij nieuw met Android, maar volgens mij moet het gewoon kloppen wat ik nu heb, niet?

Weet iemand waar dit aan kan liggen? Bedankt!

Mijn iRacing profiel