Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

3. diel - Spinner - Vlastné TextView položky - Java kód

V minulej lekcii, Vlastné Android komponent - Vytvorenie a usadenie do layoutu , sme vytvorenú komponent usadili do layoutu.

V dnešnom Java Android tutoriálu sa budeme venovať Java kódu druhého Spinner, ktorý sa bude od toho prvého líšiť nielen vzhľadom, ale i spôsobom práce s dátami.

Java kód druhého Spinner

Po príprave všetkého XML kódu druhého Spinner sa vrhneme na jeho Java kód v súbore MainActivity.java. Tu doplníme dve premenné:

  • spinnerCustomItemText a
  • labelCustomItemText.

Kód metódy onCreate() doplníme o inicializáciu nových premennými a volanie metódy initCustomItemTextSpinner(), ktorú budeme deklarovať za okamih. Java kód súboru MainActivity.java bude teraz vyzerať takto:

public class MainActivity extends AppCompatActivity {

    Spinner spinnerDefault;
    TextView labelSpinnerDefault;

    Spinner spinnerCustomItemText;
    TextView labelCustomItemText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        spinnerDefault = findViewById(R.id.spinnerDefault);
        labelSpinnerDefault = findViewById(R.id.labelSpinnerDefault);

        spinnerCustomItemText = findViewById(R.id.spinnerCustomItemText);
        labelCustomItemText = findViewById(R.id.labelCustomItemText);

        initDefaultSpinner();
        initCustomItemTextSpinner();
    }

    // ...

Inicializácia Spinner

Teraz sa pustíme do deklarácie inicializačnú metódy druhého spinnera, ktorá je volaná v metóde onCreate(). Metódu initCustomItemTextSpinner() pridáme na koniec triedy:

private void initCustomItemTextSpinner() {
    String[] monthsArray = getResources().getStringArray(R.array.months_array);
    List list = new ArrayList(Arrays.asList(monthsArray));
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner_item, list);
    adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
    spinnerCustomItemText.setAdapter(adapter);

    spinnerCustomItemText.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            labelCustomItemText.setText(parent.getItemAtPosition(position).toString());
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });
}

Vo vyššie uvedenej metóde najprv vytvárame pole textových reťazcov z poľa months_array pripraveného v resources projektu. V ďalšom riadku týmto poľom inicializujeme novovytvorenú kolekciu list, ktorú následne použijeme ako tretí parameter konstruktoru objektu typu ArrayAdapter.

Ponúka sa otázka, prečo máme u druhého spinnera "nalievanie" dát do adaptéru riešené pomocou kolekcie a nie pomocou poľa, ako v prípade prvého Spinner. Odpoveď je jednoduchá - Aby sme si ukázali aj iný postup a iný konštruktor triedy ArrayAdapter, ktorá má celkom šesť konstruktoru. Tiež tým, že máme objekt s položkami definovaný v osobitnej premenné a nie priamo v parametri konstruktoru adaptéra (ako u prvého Spinner), môžeme k tomuto zoznamu položiek priamo pristupovať pri volanie metódy onItemSelected() pri voľbe položky Spinner.

Ďalej vytvárame už známy ArrayAdapter, prostredníctvom ktorého naplníme Spinner dátami. Ako už bolo naznačené, ako zdroj údajov použijeme vopred pripravenú kolekciu v premennej list. Preto tu použijeme iný konštruktor triedy ArrayAdapter. Pre porovnanie si ukážeme konštruktor použitý v prvom Spinner a hneď pod ním konštruktor, ktorý používame teraz:

// První spinner
ArrayAdapter<String> adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.days_array));

// Druhý spinner
ArrayAdapter<String> adapter = new ArrayAdapter(this, R.layout.spinner_selected_item, list);

Konštruktor druhého Spinner tiež prijíma tri parametre:

  • Zhodne s prvým konštruktor je prvým parametrom aktuálny kontext a
  • druhým parametrom ID layoutu zvolenej položky. Prvý spinner používa defaultný vzhľad, zatiaľ čo druhému Spinner tu nastavujeme vzhľad definovaný v nami vytvorenom XML návrhu v súbore spinner_selected_item.xml.
  • A v treťom parametri máme odlišnosť týchto dvoch konštruktor - u toho prvého tu máme dátový typ poľa, zatiaľ čo v druhom konstruktoru máme kolekciu List<String>.

V Java kóde metódy pokračujeme už známym volaním metódy setDropDownViewResource() na objekte adaptéra, čím Spinner nastavíme vzhľad položiek rozbaleného menu. Tu, opäť na rozdiel od prvého Spinner, použijeme referenciu na nami vytvorený XML súbor s návrhom vzhľadu spinner_selected_item.xml. Ďalším riadkom Spinner nastavujeme vytvorený adaptér volaním metódy setAdapter().

Pri druhom Spinner definujeme akciu po zvolení jednej z položiek menu rovnako ako u prvého Spinner ai tu bude zvolený text zobrazený v príslušnom TextView pod Spinner. V nasledujúcej ukážke kódu si ukážeme ďalšie dve možné varianty získanie dát zo zvolenej položky v prepísané metóde onItemSelected(). Využijeme toho, že máme zoznam položiek uložený v zvláštnej premennej list mimo adaptér, ako bolo spomenuté vyššie:

labelCustomItemText.setText(list.get((int) id).toString());

alebo:

labelCustomItemText.setText(list.get(position).toString());

Požadovanú hodnotu získame priamo z premennej list. Správny index tejto položky získame buď pomocou premennej id (nutná typová konverzia z typu long na typ int) a alebo pomocou premennej position. Tieto dve premenné získame z parametrov prepísané metódy onItemSelected().

Týmto sme dokončili druhú časť ukážkové aplikácie s druhým Spinner a už vieme upravovať vzhľad TextView jeho položiek. Projekt s prvými dvoma Spinner je k stiahnutiu pod lekcií.

V budúcej lekcii, Spinner - Príprava pre vytvorenie obrázkových položiek , si pripravíme XML a vlastné Java triedu pre Spinner s obrázkami položiek.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 8x (1.47 MB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Vlastné Android komponent - Vytvorenie a usadenie do layoutu
Všetky články v sekcii
Vlastné View pre Android aplikácie
Preskočiť článok
(neodporúčame)
Spinner - Príprava pre vytvorenie obrázkových položiek
Článok pre vás napísal Pavel
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování v Javě, hlavně pro Android. Mezi jeho další zájmy patří Arduino, Minecraft.
Aktivity