Hämta Viewkomponent från ListView

Diskussion i 'Frågor, support och diskussion' startad av vrutberg, 11 nov 2009.

  1. vrutberg

    vrutberg Infant Droid Medlem

    Blev medlem:
    8 nov 2009
    Inlägg:
    14
    Mottagna gillanden:
    0

    MINA ENHETER

    Hej!

    Första inlägget här.. Har ingen egen Androidtelefon, utan en iPhone, men då jag inte har någon Mac så är det lite knivigt att utveckla för den, så jag har börjat utveckla för Android istället. :)

    Nåväl, till mitt problem. Jag har en ListActivity där jag visar upp en lista med objekt med hjälp av en ArrayAdapter. Högst upp i min activity har jag en inputfält och en knapp för att lägga till nya objekt i listan. När man skriver i fältet och trycker på knappen ska den lägga till i listan och markera objektet som valt :)checked/selected, objekten visas upp som CheckedTextView). Den första biten, att lägga till i listan, har jag kommit över utan några större problem. Det är att kryssa i checkboxen jag inte förstår hur man ska göra. Kortfattat så vill jag alltså hämta en CheckedTextView från listan baserat på ett index som jag känner till. Hur gör jag det här? :P Har googlat och läst i dokumentationen utan någon större framgång.

    Jag har försökt att förstå hur ListViewns getView() fungerar utan framgång, för jag har antagit att det är den man ska använda för att ropa på UI-objekt.

    Tacksam för hjälp. :)

    /Viktor
     
  2. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 jun 2009
    Inlägg:
    1 768
    Mottagna gillanden:
    44

    MINA ENHETER

    Lite osäker, men jag tycker du verkar gå från fel håll. Jag skulle istället hämta upp raden ur modellen, ändra värdet i modellen och sedan be vyn att rita om sig.
     
  3. vrutberg

    vrutberg Infant Droid Medlem

    Blev medlem:
    8 nov 2009
    Inlägg:
    14
    Mottagna gillanden:
    0

    MINA ENHETER

    Jo, jag har funderar lite på den vägen också. Problemet med det är att som det är nu så vet inte modellen ifall den är ikryssad eller inte, utan det (är tänkt att) hanteras helt och hållet av UI-klasserna. Sen för att ta ut vilka som är valda hade jag tänkte anropa ListViewns getCheckItemIds().

    Edit: Kan förklara lite mer hur jag har det uppbyggt. Min "modellklass" är i princip en wrapper runt en rad i databasen, med getters och setters för de olika fälten. Objekten av denna klass lagras i sin tur i en ArrayList som sedan lagras i ArrayAdaptern. För att rätt text ska visas i listan har modellklassen en toString()-metod som skriver ut det jag vill. Har försökt att använda så mycket av de klasser som finns i Android SDK utan att behöva skriva så mycket eget, men mitt problem går kanske inte att komma runt utan att skriva en egen adapter?
     
    Last edited: 11 nov 2009
  4. sandos

    sandos Adult Droid Medlem

    Blev medlem:
    27 maj 2009
    Inlägg:
    715
    Mottagna gillanden:
    8

    MINA ENHETER

    Roligt att jag på tåget idag höll på med nästan exakt samma sak, och jag gick till slut den vägen som Kaj pratar om, via modellen. Fick det dock inte att fungera, jag försöker flagga mina vyer (jag har satt min listas choicemode) i onItemClickListener, och sedan sätta bakgrundsfärg eller liknande i en egen SimpleAdapter.ViewBinder. Men det vill sig inte riktigt. :(
     
    Last edited: 11 nov 2009
  5. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 jun 2009
    Inlägg:
    1 768
    Mottagna gillanden:
    44

    MINA ENHETER

    Kom att täka på en sak. Vet inte om tabellen i Android fungerar likadant, men ev gör den det. I Swing (vanligt Java-Gui) fungerar tabeller på detta sättet:

    En tabell har en modell, och en grafisk komponent (ui-klass) som används för att rita/rendrera rader varje rad. Dvs, samma instans används för att rendrera alla värden. Det finns i det fallet inte en instans per rad, och därför räcker det inte med att försöka hålla reda på det i ui-klassen. Man måste istället uppdatera modellen när någon gör ett val.
     
  6. vrutberg

    vrutberg Infant Droid Medlem

    Blev medlem:
    8 nov 2009
    Inlägg:
    14
    Mottagna gillanden:
    0

    MINA ENHETER

    @Sandos: Kul! Posta gärna här ifall du lyckas lösa det. :)

    @Kaj: Med modell, menar du en wrapper kring allt data? Det har jag faktiskt inte tänkt på. Ska utforska det lite närmare imorgon bitti. Återkommer under morgondagen! Tack för tipset!
     
    Last edited: 11 nov 2009
  7. sandos

    sandos Adult Droid Medlem

    Blev medlem:
    27 maj 2009
    Inlägg:
    715
    Mottagna gillanden:
    8

    MINA ENHETER

    Kände inte till CheckedTextView, problemet är att jag kan inte använda den i layout-editorn? Får InstantiationException.
     
  8. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 jun 2009
    Inlägg:
    1 768
    Mottagna gillanden:
    44

    MINA ENHETER

    Japp.
    Din collection kan ses som en modell. Varje entry i den skall vara ett värdeobjekt som representerar datat för en rad.
     
  9. vrutberg

    vrutberg Infant Droid Medlem

    Blev medlem:
    8 nov 2009
    Inlägg:
    14
    Mottagna gillanden:
    0

    MINA ENHETER

    Har fortsatt på det här idag och så här långt har jag kommit..

    Har nu gjort en klass som ska agera "brygga" mellan UI-datat och backenddatat, RowModel. Den innehåller en instans av min backendklass samt en boolean som signalerar ifall den är vald (checked) eller ej. Instanser av denna läggs in i en ArrayList som i sin tur ligger i en extendad ArrayAdapter där jag har överladdat getView() för att kunna sätta checked eller inte. Har även bindat en OnClickListener till varje rad i min lista som tar hand om att sätta både mitt UI-objekt och isChecked=true på rätt instans i listan av RowModels.

    Det hela vill dock inte riktigt lira verkar det som. När jag själv sätter en OnClickListener så ersätter jag defaultlistenern som verkar göra lite jobb som jag inte gör. Skrollar jag t.ex. upp eller ner i listan så verkar inte checked-värdet sparas i UI-klassen, något som jag inte kan förstå då jag steppat genom koden med debuggern och den är satt på rätt sätt överallt vad jag kan se.

    Struntar jag i att sätta OnClickListener så fungerar allt förutom att den inte uppdaterar värdet i min RowModel-klass.

    Så där är jag nu alltså. Hittar jag implementationen av defaultlistenern kan jag se vad den gör och på sätt imitera det i min implementation. Har kikat i CheckedTextView-, TextView- och View-klasserna utan framgång. Om någon vet var den finns blir jag klad hest. :)

    /Viktor
     
  10. sandos

    sandos Adult Droid Medlem

    Blev medlem:
    27 maj 2009
    Inlägg:
    715
    Mottagna gillanden:
    8

    MINA ENHETER

    Jag har faktiskt löst mitt problem, men det är lite annorlunda och har istället fått ett annat problem. Mitt problem som kvarstår är att SimpleAdapter.getView(int index) är buggig! Varannan gång returnerar den fel view! Konstiga är att jag använder detta i en annan activity och där fungerar den som den ska.

    Jag använder nu CheckedTextView, och de verkar iaf behålla sina checked-properties som de ska.

    Edit: problemet verkar bero på att min ListView hade choiceMode satt till single? Utan choicemode så fungerar det. Jag missförstår nog hur den ska fungera...

    Länk till koden: http://code.google.com/p/android-de...ndroid/delayed/prefs/PreferencesActivity.java
     
    Last edited: 12 nov 2009
  11. johannilsson

    johannilsson Adult Droid Medlem

    Blev medlem:
    23 jun 2009
    Inlägg:
    577
    Mottagna gillanden:
    8

    MINA ENHETER

    Har också haft problem med just recyclingen. Jag löste det genom att inte återanvända convertView vilket är det som rekommenderas annars. Kanske kan vara värt att testa om du idag återanvänder convertView om den inte är null.
     
  12. vrutberg

    vrutberg Infant Droid Medlem

    Blev medlem:
    8 nov 2009
    Inlägg:
    14
    Mottagna gillanden:
    0

    MINA ENHETER

    Har även jag lyckats lösa mina problem nu (ÄNTLIGEN!). Gick tillbaka till en ArrayAdapter, och hittade onListItemClick() som jag overridade, och nu håller jag själv koll på vilka items användaren har klickat på. För att markera en item som selected använder jag listviewns setItemChecked().

    Tack för all hjälp i den här tråden. :)

    /Viktor
     
  13. sandos

    sandos Adult Droid Medlem

    Blev medlem:
    27 maj 2009
    Inlägg:
    715
    Mottagna gillanden:
    8

    MINA ENHETER

    Förstod inte riktigt vad convertView refererar till?