Hirdetés

Alkalmazásfejlesztés badára: Testre szabható lista

Bevezető

Az eddigiekben elkészített kis appunkból még hiányzik az, hogy a bejegyzéseinket törölni is tudjuk. Erre egy szép megoldás lenne, ha a listánkban a sorok mellett egy-egy gomb lenne, amivel a kukába küldhetjük az adott sort. Ehhez azonban nem elég az előzőekben használt Osp::Ui::Controls::List, ez a listatípus rugalmatlan ilyen használatra. Más listatípust kell használnunk, de szerencsére van megoldás: Osp::Ui::Controls::CustomList.

Pimp my list

A Osp::Ui::Controls::CustomList a badában található listák supermanje, a sorok formátuma (és ezzel együtt a dizájnja) nagy mértékben testreszabható, ráadásul ha később módosítani szeretnénk, nem kell újraírni az egészet, egyszerűen kiegészíthetjük az újabb ötleteinkkel. Nekünk a következő formátum kell: egy sor szöveg és egy ikon, ami érintésre törli az adott sort (lásd kép).

Az Osp::Ui::Controls::CustomList használatakor nem a lista beállításain keresztül customizálgatunk, ezt egy speciális osztályon, az Osp::Ui::Controls::CustomListItemFormat-on keresztül tehetjük meg. Egyébként ha megnézzük a CustomList beállításait (akár kódból, akár a UI builderben), kevesebb lehetőséget tartalmaz, mint akár a sima List: ez azért van, mert a beállítások átkerültek a CustomListItemFormat-ba. A formázás lényege, hogy a vizuális elemeket (nekünk ebből most kettő van, egy szöveges és egy ikon) a megjelenítés sorrendjében hozzáadjuk a CustomListItemFormat típusú változónkhoz. Ehhez két függvény áll rendelkezésünkre, az AddElement (int elementId, const Osp::Graphics::Rectangle &rect, int textSize, const Osp::Graphics::Color &normalTextColor, const Osp::Graphics::Color &focusedTextColor) a szöveges, az AddElement(int elementId, const Osp::Graphics::Rectangle &rect) a kép típusú elemhez szükséges. A paraméterek elég beszédesek: az elementID igazából actionID-ként fogható fel, ezen keresztül lehet megállapítani, melyik elemre "kattintottunk". Az elem méretét egy Rectangle típusú befoglaló téglalappal adhatjuk meg, a szövegesnél továbbiakban a betűméretet és a két színt (aktív és passzív állapot) is beállíthatjuk. Miután hozzáadtuk az elemtípusokat, egyenként engedélyezni kell az Eventjeiket, ezt a SetElementEventEnabled függvénnyel tehetjük meg. Nekünk csak a törlés ikonra kell ez utóbbit megtennünk.

Át kell még írnunk a sorok hozzáadását végző függvényt is. Minden új elemhez létre kell hoznunk egy CustomListItem-et, amelynek a saját formátumunkat adjuk meg. Ez után elemenként hozzáadjuk a tartalmunkat: a szöveges elembe a szöveget, az ikon elembe pedig az előre betöltött ikonjainkat állítjuk be, csak így adhatjuk a listához. Ha most futtatunk egyet, szépen megjelenik a szétpimpelt listánk, de még nem történik semmi. Az eventek regisztrálásához implementálnunk kell az Osp::Ui::ICustomItemEventListener-t. Ez két függvény megírását vonja maga után, az OnItemStateChanged két változata ez: az egyik magán a listasoron, a másik az egyes elementeken regisztrálja az eseményeket. Nekünk utóbbi kell, itt kell vizsgálnunk a megfelelő actionID-t, majd lekezelni a hozzá tartozó eseményt.

Azonban ahhoz, hogy törölhessünk, szükséges egy kis hack. Ha megérintünk egy listaelemet (azaz egy sort), az visszaadja a sor számát, azonban a tartalmát nem, így explicit nem tudunk hivatkozni az adatbázisban lévő sorra. Ezt úgy kerültem meg, hogy minden refresh-híváskor egy Osp::Base::Collection::arrayListT-ben eltároltam az adatbázisból kiszedett aktuális sorok kulcsait. Így egyszerűen annyi volt a dolgom, hogy ha érkezett egy sorszám, lekérdeztem a lista megfelelő elemét, így megkaptam a kulcsot, amivel már meg lehet hívni a törlő függvényt.

A kód természetesen ismét letölthető innen.

holdmester

Azóta történt

Előzmények