JavascriptProva

mercoledì 21 settembre 2016

Ripasso dei Menu e di ArrayAdapter.

Un po' di rallentamenti? Niente paura, adesso si recupera.

Bene, ho costruito un database nel quale provare il matching.
Ora costruisciti una visualizzazione, magari con un ListView o un GridView.
Così con l'occasione ripassi anche l'uso di questi controlli che non pratichiamo da tempo.

Ecco, ho ripassato i menu.
O meglio li sto ripassando.
Ho creato un file xml di nome "menu", mettendolo in una sottocartella di risorse che ho creato io, chiamata tanto per cambiare "menu".
La struttura non è poi così difficile: si tratta di mettervi semplicemente un item con due attributi: un id e un titolo. Il titolo è quello che apparirà nell'activity

Ecco la mia creazione:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu"
        android:title="Menu">

    </item>
</menu> 
Ora devo gestirlo in Java: creati sempre uno mnemonico, per ricordare da dove iniziare.
OnCreateOptionsMenu: si tratta della creazione di un menu di opzioni, e questo è sintetizzato nel nome del metodo.
Ricordiamo che è booleano.
Provo a riscriverlo:
    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        
        return true;
    }
Ecco. Non ho messaggi di errore.
Ora però devo aggiungerci l' "inflataggio" del menu a partire dalla risorsa.
Prima devo evocare un oggetto "menuInflater", quindi devo fargli inflatare la risorsa.
Provo:
    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        MenuInflater menuInflater=getMenuInflater();
        menuInflater.inflate(R.menu.menu,menu);
        return true;
    }
Una volta evocato, il menuInflater inflata, come è suo compito. E però devo specificare di inflatare la risorsa R.menu.menu dando la forma all'argomento di questo metodo.
Provo a cambiare i nomi per vedere se quel menu che devo inserire alla terza riga è inteso come quello che viene fornito come parametro.
    @Override
    public boolean onCreateOptionsMenu(Menu cicciobello){
        MenuInflater menuInflater=getMenuInflater();
        menuInflater.inflate(R.menu.menu,cicciobello);
        return true;
    }
Così funziona.
E se i due nomi sono diversi?
    @Override
    public boolean onCreateOptionsMenu(Menu cicciobello){
        MenuInflater menuInflater=getMenuInflater();
        menuInflater.inflate(R.menu.menu,cicciobrutto);
        return true;
    }
Ottengo un errore: cannot resolve symbol cicciobrutto.
Modifico il nome del parametro:
    @Override
    public boolean onCreateOptionsMenu(Menu cicciobrutto){
        MenuInflater menuInflater=getMenuInflater();
        menuInflater.inflate(R.menu.menu,cicciobrutto);
        return true;
    }
e sparisce ogni segnalazione di errore, segno che quel menu è riferito proprio al parametro!
Ora ho un menu che si vede, apparendo quello che ho designato come "title" del menu nel documento xml.
Passiamo a studiare come si utilizza un menu, ossia come si diano delle conseguenze al click sul menu stesso.

Inizia con onOptionsItemSelected, ossia "quando viene selezionato un item di opzioni".
La prima era onCreateOptionsMenu, la seconda onOptionsItemSelected. Il verbo va stavolta alla fine. E l'elemento viene chiamato "elemento di opzioni".
Il parametro è MenuItem, ossia l'elemento.
Di questo elemento va valutato l'Id.

Provo a metterlo per iscritto...

Lo scheletro va bene:
    @Override
    public  boolean onOptionsItemSelected(MenuItem item){
        
        return true;
    }
Ora dobbiamo selezionare l'Id dell'item fornito come parametro.
    @Override
    public  boolean onOptionsItemSelected(MenuItem item){

        switch(item.getItemId()){
            case R.id.menu:
                Toast.makeText(getApplicationContext(),"Menu",Toast.LENGTH_LONG).show();
        }
        return true;
    }
Sembra semplice.

E in effetti funziona.


Ora voglio costruirmi, comandato da Menu, una seconda activity in cui visualizzare il database.

Ecco: sull'adapter per le listView mi trovo sempre in difficoltà, ho studiato una forma complessa e ora non ricordo niente. Come fare?
Io suggerirei di andare a studiare intanto la forma più semplice, per poi successivamente approfondire.
Vai a cercare sulla documentazione ArrayAdapter o qualcosa di simile...

Ho provato la sintassi minimale dell'istanziazione, ma ottengo un messaggio di errore...
arrayAdapter =new ArrayAdapter<String>();
Cosa manca?

Ecco, vedi? Studiare prima i casi più semplici è più produttivo, perché per primi ti fa vedere i meccanismi fondamentali, quindi approfondendo con la loro conoscenza si può capire meglio le cose.
Nel costruttore di un ArrayAdapter, a parte il context, devi avere il layout nel quale ricercare la textview e la textview stessa.
A questi parametri fai seguire un array di stringhe che hai deciso di impiegare.
Con un database, sarà necessario mettere tutti gli elementi di un Cursor in un array di stringhe...

Proviamo con un array semplice.
Preparati pure il layout, velocemente.

        listView =(ListView) findViewById(R.id.listView);

        String[] array= {"lunedi","martedi","mercoledi","giovedi","venerdi","sabato","domenica"};
        
        arrayAdapter =new ArrayAdapter(getApplicationContext(),
                R.layout.row,R.id.textView3,array);
    }
Ecco: e ora, una volta preparato il layout, lo attribuiamo alla listView.

listView.setAdapter(arrayAdapter);
Proviamo...

dopo aver modificato la gestione dei menu in questo modo:
    @Override
    public  boolean onOptionsItemSelected(MenuItem item){

        switch(item.getItemId()){
            case R.id.menu:
                Intent intent=new Intent(MainActivity.this,Seconda.class);
                startActivity(intent);
        }
        return true;
    }
Vai!...

E infatti è riuscita.

Nessun commento:

Posta un commento