Autore Topic: AutoCompleteTextView e MultiAutoCompleteTextView  (Letto 589 volte)

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
AutoCompleteTextView e MultiAutoCompleteTextView
« il: 03 Ottobre 2011, 09:42:33 CEST »
0
Ho un database locale con oltre 5000 prodotti, l'utente deve poter ricercare qualsiasi prodotto però senza uscire dall'activity in cui si trova. Avevo pensato di usare un AutoCompleteTextView però mi sono resto conto che se ricerco una parola non c'è nessun problema ma se lascio uno spazio mi scompare il menu a tendina e l'AutoCompleteTextView non funziona più, ho provato ad usare anche MultiAutoCompleteTextView ma non noto differenze. Che voi sappiate esiste un modo per dire all'AutoCompleteTextView di ricercare non solo la prima parola inserita ma anche le altre che uno eventualmente scrive ?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
R: Re:AutoCompleteTextView e MultiAutoCompleteTextView
« Risposta #1 il: 03 Ottobre 2011, 10:03:10 CEST »
+1
Ho un database locale con oltre 5000 prodotti, l'utente deve poter ricercare qualsiasi prodotto però senza uscire dall'activity in cui si trova. Avevo pensato di usare un AutoCompleteTextView però mi sono resto conto che se ricerco una parola non c'è nessun problema ma se lascio uno spazio mi scompare il menu a tendina e l'AutoCompleteTextView non funziona più, ho provato ad usare anche MultiAutoCompleteTextView ma non noto differenze. Che voi sappiate esiste un modo per dire all'AutoCompleteTextView di ricercare non solo la prima parola inserita ma anche le altre che uno eventualmente scrive ?

Con il MultiAutocompleteTextView devi impostare quale carattere vuoi usare come token per la divisione dellle parole...

Inviato dal mio HTC Desire usando Tapatalk

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:AutoCompleteTextView e MultiAutoCompleteTextView
« Risposta #2 il: 03 Ottobre 2011, 10:13:06 CEST »
0
Sò che sei in giro (lo vedo perchè posti con TapaTalk :-)) ma ricordi per caso come si fa ? ho vistoi vari metodi di MultiAutoCompleteTextView  ma qui parla solo di
Codice (Java): [Seleziona]
autotext_nome_prodotti.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
Edit : forse mi sbaglio ma mi sà che si può decidere solo da quale carattere far separare le varie parole....il problema mio è diverso perchè se ho un nome tipo Kinder Colazione Più e scrivo Kinder Colazione il MultiAutoCompleteTextView non ricerca anche Colazione ed il menu a tendina scompare....spero di sbagliarmi...

Edit 2 : Fortunatamente mi sbagliavo :-) ecco il codice :
 public class SpaceTokenizer implements Tokenizer {
       
       
Codice (Java): [Seleziona]
public int findTokenStart(CharSequence text, int cursor) {
        int i = cursor;
         
        while (i > 0 && text.charAt(i - 1) != ' ') {
            i--;
        }
        while (i < cursor && text.charAt(i) == ' ') {
            i++;
        }
         
        return i;
        }
         
        public int findTokenEnd(CharSequence text, int cursor) {
        int i = cursor;
        int len = text.length();
         
        while (i < len) {
            if (text.charAt(i) == ' ') {
                return i;
            } else {
                i++;
            }
        }
         
        return len;
        }
         
        public CharSequence terminateToken(CharSequence text) {
        int i = text.length();
         
        while (i > 0 && text.charAt(i - 1) == ' ') {
            i--;
        }
         
        if (i > 0 && text.charAt(i - 1) == ' ') {
            return text;
        } else {
            if (text instanceof Spanned) {
                SpannableString sp = new SpannableString(text + " ");
                TextUtils.copySpansFrom((Spanned) text, 0, text.length(),
                        Object.class, sp, 0);
                return sp;
            } else {
                return text + " ";
            }
        }
        }
        }

Basta richiamare questa classe con acTextView.setTokenizer(new SpaceTokenizer()); ed il gioco è fatto !!

Grazie Ricky !! Rep+ ;)

Edit 3 : Ho parlato troppo pesto :( così in effetti funziona però ogni parola che viene scritte è una ricerca a se....se scrivo Kinder lui mi visualizza tutti i prodotti che contengono Kinder però se poi aggiungo anche Fetta lui mi visualizza tutti i prodotti che contengono fetta anche se non contenfono Kinder :(

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AutoCompleteTextView e MultiAutoCompleteTextView
« Risposta #3 il: 03 Ottobre 2011, 13:26:26 CEST »
0
Se le parole possono contenere degli spazi allora forse usare lo spazio come separatore non è la soluzione migliore. Io direi di tenere la virgola.... a questo punto però il problema è nel modo in cui viene fatta la query per trovare la parola. Illuminaci con un po' di codice :P

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:AutoCompleteTextView e MultiAutoCompleteTextView
« Risposta #4 il: 03 Ottobre 2011, 13:41:27 CEST »
0
Se le parole possono contenere degli spazi allora forse usare lo spazio come separatore non è la soluzione migliore. Io direi di tenere la virgola.... a questo punto però il problema è nel modo in cui viene fatta la query per trovare la parola. Illuminaci con un po' di codice :P

Ma non c'è una query fatta sul momento...i nomi dal database li prendo con una seplice select e poi li metto in un array e con questo codice creo l'adapter :
Codice (Java): [Seleziona]
ArrayAdapter<String> adapter = new ArrayAdapter<String>(mcontext, android.R.layout.simple_spinner_item,array);poi passo a settare il MultiAutoCompleteTextView con l'adapter così :
Codice (Java): [Seleziona]
final MultiAutoCompleteTextView nome_prodotti = (MultiAutoCompleteTextView)dialog_segnala.findViewById(R.id.nome_prodotto);
nome_prodotti.setTokenizer(new SpaceTokenizer());
nome_prodotti.setAdapter(adapter_nome_prodotti);

dove new SpaceTokenizer() è la classe che vi ho postato prima che in pratica, a quanto ho capito, serve solo per sostituire alla virgola lo spazio.
      

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AutoCompleteTextView e MultiAutoCompleteTextView
« Risposta #5 il: 03 Ottobre 2011, 14:03:19 CEST »
0
Secondo me dovresti personalizzare il modo in cui l'ArrayList viene filtrato andando a specificare una implementazione custom della classe Filter. Per fare questo devi ereditare l'ArrayAdapter implementandogli un po' di roba...  io avevo fatto una roba del genere... dagli un occhio:

Codice (Java): [Seleziona]
public class TagsAdapter extends ArrayAdapter<Tag> {

    private int mResource;

    private List<Tag> mTags;
    private List<Tag> mOriginalTags;

    private int mTextViewResource;

    private Context mContext;

    private LayoutInflater mInflater;

    public TagsAdapter(Context context, int resource, int textViewResourceId, List<Tag> objects) {
        super(context, resource, textViewResourceId, objects);
        mTags = objects;
        mContext = context;
        mResource = resource;
        mTextViewResource = textViewResourceId;
        mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        Tag t = getItem(position);

        convertView = mInflater.inflate(mResource, null);
        TextView tv = (TextView) convertView.findViewById(mTextViewResource);
        tv.setText(t.getName());
        return convertView;

    }

    @Override
    public Filter getFilter() {
        return new TagFilter();
    }

    private class TagFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            Log.d("performFiltering:" + constraint);
           
            if ( mOriginalTags == null ) {
                mOriginalTags = new ArrayList<Tag>();
                mOriginalTags.addAll( mTags );
            }

            FilterResults result = new FilterResults();

            if (constraint != null && constraint.toString().length() > 0) {
                List<Tag> filtered = new ArrayList<Tag>();

                for (Tag t : mTags) {

                    if (t.getName().toLowerCase().contains(constraint)) {
                        filtered.add(t);
                    }
                }

                synchronized (filtered) {
                    result.values = filtered;
                    result.count = filtered.size();
                }

            } else {
                result.values = mOriginalTags;
                result.count = mOriginalTags.size();
            }

            return result;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {

            List<Tag> filtered = (List<Tag>) results.values;

            clear();
           
            for (Tag t : filtered) {
                add(t);
            }

            notifyDataSetChanged();

        }

    }

}

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:AutoCompleteTextView e MultiAutoCompleteTextView
« Risposta #6 il: 03 Ottobre 2011, 14:05:08 CEST »
0
Ok....è più dura di quanto pensassi allora :) oggi pomeriggio mi metto sotto e me lo studio :-( grazie per l'aiuto ! ;)