La categoria viene selezionata attraverso una AutoCompleteTextView, per cui bisogna trovare il modo di distinguere le due evenienze di "nuova categoria" o di "categoria già esistente" in questo controllo.
Forse ho trovato qualcosa...
Bene. Costruiamo un programma con una AutoComplete che esegua un certo programma solo se viene inserito nuovo testo rispetto a uno suggerito.
Ho creato un AutoCompleteTextView:
public class MainActivity extends Activity { AutoCompleteTextView autoComplete; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); autoComplete = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1); }Ora dovrei usare un adapter per connetterla a una lista.
Prima ancora mi serve una lista: procedo a creare un'ArrayList:
ArrayList<String> lista=new ArrayList<String>(); String[] matrice={"lunedi","martedi","mercoledi","giovedi","venerdi","sabato","domenica"}; lista.addAll(Arrays.asList(matrice));E ho trovato anche il modo di riempire un'ArrayList senza stare lì a dare tremila righe di codice: dichiarare e istanziare un array e poi aggiungere il contenuto di quest'array tutto in un colpo.
Bene, ora che ho creato la lista devo connetterla mediante un adapter alla AutoCompleteTextView.
Come fare?
Estendiamo un ArrayAdapter... anzi no, non estendiamo un bel niente: mi serve un ArrayAdapter così com'è...
public class MainActivity extends Activity { AutoCompleteTextView autoComplete; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); autoComplete = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1); ArrayListLa sintassi dell'ArrayAdapter è molto più semplice di quella del BaseAdapter che ho esteso finora: l'ho fatto sempre per la mia mania di voler andare nel cuore delle cose, ma è più comodo prendersi un ArrayAdapter già bello e costruito.lista=new ArrayList (); String[] matrice={"lunedi","martedi","mercoledi","giovedi","venerdi","sabato","domenica"}; lista.addAll(Arrays.asList(matrice)); Log.d("LISTA",lista.get(0)); ArrayAdapter myArrAdapter = new ArrayAdapter (this,android.R.layout.simple_list_item_1,lista); autoComplete.setAdapter(myArrAdapter); }
Ecco: come view da estendere si usa espressamente android.R.layout.simple_list_item_1, e il gioco è fatto.
Nella mia applicazione, ho una AutoCompleteTextView che dà il valore al campo categoria del database.
Ora a ogni categoria va abbinata un'immagine, che avrà il suo path, il quale andrà memorizzato in un altro campo del database. Ma non sarà più economico creare un'altra tabella con un abbinamento categorie-immagini anziché creare un altro campo nella tabella contenente il path dell'immagine?
Se la categoria è sconosciuta, scegliere l'immagine e aggiungere alla tabella delle categorie un nuovo record categoria con il path; se la categoria è conosciuta evitare il codice che fa tutto questo... Poi però all'atto della selezione per popolare la ListView dell'activity principale si deve andare sulla nuova tabella categorie-path, così si può evitare il distinct. E nel momento in cui viene operata la scelta delle categorie si fa una query basata su un where... Sì, mi sa che devo rivedere da capo quell'applicazione, smontare di sana pianta i database e rifarli con un criterio più razionale!
Ora però mi devo occupare della mia AutoCompleteTextView...
Con il codice di cui sopra, la AutoComplete funziona!
Ora provo giusto l'evento click sul suggerimento...
public class MainActivity extends Activity { AutoCompleteTextView autoComplete; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); autoComplete = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1); ArrayListFunziona! Ottengo in LogCat le stringhe "AUTOCOMPLETE" "ITEMCLICK" solo quando clicco sul suggerimento!lista=new ArrayList (); String[] matrice={"lunedi","martedi","mercoledi","giovedi","venerdi","sabato","domenica"}; lista.addAll(Arrays.asList(matrice)); Log.d("LISTA",lista.get(0)); ArrayAdapter myArrAdapter = new ArrayAdapter (this,android.R.layout.simple_list_item_1,lista); autoComplete.setAdapter(myArrAdapter); autoComplete.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { Log.d("AUTOCOMPLETE","ITEMCLICK"); } });
Questo mi può permettere di aggiungere alla tabella categorie del mio ipotetico nuovo database solo nel caso in cui questo suggerimento non venga cliccato.
Ci vorrà anche un elemento di maggiore sicurezza, ossia non inserire nel database una nuova categoria dal nome uguale al precedente: bisogna creare campi con valore unico...
Nessun commento:
Posta un commento