Domanda

Ho 3 AutoCompleteTextViews e vorrei registrare 2 string [] adattatori su di essi. Attualmente, sto facendo questo:

atw_from.setAdapter(new ArrayAdapter(ctx, android.r.layout.simple_dropdown_item_1line, stages_adapter));
.

Diciamo che il mio utente vuole digitare "Középmező", inizia a digitare "Közé" e sarà offerto di scegliere Középmező, fino a questo, è piuttosto semplice. Ma cosa succede se l'utente è troppo pigro per digitare accenti (e molti di loro sono pigri), quindi digiterà solo Kozepmezo, allora non avrà alcuna offerta, dal momento che non ci sarà kozepmezo nella mia stringa []. La cosa che voglio è, se ti dice in "Koze", dovrebbe essere offerto Középmező, quindi anche se non usa gli accenti, verrà sempre offerto la parola reale con gli accenti.

Attualmente, ho una soluzione piuttosto sciocca, ho una stringa [] con la doppia dimensione dell'originale [], il primo tempo contiene le parole con gli accenti, il secondo contiene le versioni disattivanti. Così ora, se its tips közé, verrà offerto Középmező, e se ti registri Koze, sarà offerto Kozepmezo. Funziona perché il server può elaborare entrambe le versioni, ma sembra solo sciocco, e voglio risolverlo.

Da quello che capisco, dovrei creare un adattatore personalizzato completo. È il miglior approccio, o c'è qualche soluzione inclusa nell'SDK? Se dovrei fare l'adattatore personalizzato, qualcuno potrebbe indicarmi nella giusta direzione, su come farlo? :)

Modifica: Aggiunta la mia risposta, dovrebbe funzionare per tutti, applausi per l'altra risposta, che mi ha indirizzato alla buona direzione!

È stato utile?

Soluzione

Okey, dopo un sacco di dolore nel culo che si occupa di questo, ecco la cosa che ho fatto alla fine. Questa non è affatto una buona pratica, e potrei farlo male, ma almeno funziona perfettamente ora.

Simply Ctrl + C, Ctrl + V Il codice sorgente di baseadapter e ctrl + c, ctrl + v il codice sorgente di arrayadapter . Ora guarda la classe interna interna, ArrayFilter, in particolare il metodo performingfiltering. Modifica (non override!) Esso, quanto vuoi, nel mio caso, ho aggiunto un sacco di cose .replace ("x", "y") cose, per la parte disaccendente.

Qualunque altra cosa provato, o prodotta la forza imprevedibile si chiude (molto, e completamente casuali), o non potevo farlo, poiché troppi metodi / variabili sono privati, anziché protetti. Devo dire, Google dovrebbe rivisitare i codici ...

Nota: non è realmente necessario Ctrl + C Ctrl + V i codici Baseadapter, poiché è una classe astratta pubblica, ma hey, non è così tanto un codice, e in questo modo tutto è lì, chiaramente visibile per te.

Cheers

Altri suggerimenti

Verrei effettivamente per un adattatore personalizzato, in cui fornisci la tua funzione di filtro per corrispondere sia alle notazioni accentuate che a disaccordo.

Un'attuale implementazione che esegue solo questo, può essere trovato qui . Fondamentalmente dovrai implementare il filtro effettivo in performFiltering - sto assumendo che tu abbia già un modo di figurare le query, dal momento che stai attualmente popolando il tuo String[] con versioni disattivanti. Volete confrontare la query con e senza accenti contro le voci nel tuo array (che vorrete utilizzare con e senza accenti). Alla fine dovresti avere almeno i seguenti quattro test:

accented(query) -> accented(entry)
accented(query) -> deaccented(entry)
deaccented(query) -> accented(entry)
deaccented(query) -> deaccented(entry)
.

Con parole di DeacCenting on-the-Fly, dovrai solo fornire il String[] con parole accentati, mentre la logica filtrante (nel tuo adattatore) si prenderà cura di abbinare le parole (DE) accentati.

Modifica: Come discusso, sotto un'implementazione del campione in uno dei miei progetti in corso.

Alcuni puntatori:

    .
  1. CustomArrayAdapter è per lo più una classe wrapper che semplifica le attività comuni; per esempio. Interazione con un avvolgente / titolare della vista. Fondamentalmente tutto ciò di cui ha bisogno è un costruttore e implementazione di updateRow (che ovviamente verrà chiamato dal metodo getView di Super Class ").
  2. CustomRowWrapper dovrebbe essere piuttosto semplice.
  3. ArrayUtil e ArrayUtil.FilterFuction prendono cura del filtro effettivo. Semplicemente ha detto che questi agiscono come sostituzione per A per il ciclo che costruisce un nuovo elenco di tutti gli elementi che corrispondono ad alcuni criteri.
    .
    public class CARMedicationSuggestionAdapter extends CustomArrayAdapter<CARMedicationInfo, RowWrapper> {
    
        private List<CARMedicationInfo> mMedications;
        private Filter mFilter;
    
        /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
         * constructor
         * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
    
        public CARMedicationSuggestionAdapter(Context context, List<CARMedicationInfo> objects) {
            super(RowWrapper.class, context, R.layout.medication_suggestion_item_layout, objects);
            // keep copy of all items for lookups 
            mMedications = new ArrayList<CARMedicationInfo>(objects);
        }
    
        /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
         * update row
         * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
    
        @Override protected void updateRow(RowWrapper wrapper, CARMedicationInfo item) {
            wrapper.getNameTextView().setText(item.toString());
        }
    
        /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
         * get filter
         * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
    
        @Override public Filter getFilter() {
            // return if already created
            if (mFilter != null) return mFilter;
            mFilter = new Filter() {
                @Override protected void publishResults(CharSequence constraint, FilterResults results) {
                    @SuppressWarnings("unchecked") List<CARMedicationInfo> filtered = (List<CARMedicationInfo>) results.values;
                    if (results == null || results.count == 0) return;
                    // clear out current suggestions and add all new ones
                    clear(); 
                    addAll(filtered);
                }
    
                @Override protected FilterResults performFiltering(final CharSequence constraint) {
                    // return empty results for 'null' constraint
                    if (constraint == null) return new FilterResults();
                    // get all medications that contain the constraint in drug name, trade name or whose string representation start with the constraint
                    List<CARMedicationInfo> suggestions = ArrayUtil.filter(mMedications, new ArrayUtil.FilterFunction<CARMedicationInfo>() {
                        @Override public boolean filter(CARMedicationInfo item) {
                            String query = constraint.toString().toLowerCase().trim();
                            return  item.mMedicationDrugName.toLowerCase().contains(query) || 
                                    item.mMedicationTradeName.toLowerCase().contains(query) ||
                                    item.toString().toLowerCase().startsWith(query); 
                        }
                    });
                    // set results and size
                    FilterResults filterResults = new FilterResults();
                    filterResults.values = suggestions;
                    filterResults.count = suggestions.size();
                    return filterResults;
                }
            };
            return mFilter;
        }
    
        /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
         * row wrapper
         * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
    
        static class RowWrapper extends CustomRowWrapper {
    
            private ImageView mIconImageView;
            private TextView mNameTextView;
    
            public RowWrapper(View row) {
                super(row);
            }
    
            public ImageView getIconImageView() {
                if (mIconImageView == null) mIconImageView = (ImageView) mRow.findViewById(R.id.icon_imageview);
                return mIconImageView;
            }
    
            public TextView getNameTextView() {
                if (mNameTextView == null) mNameTextView = (TextView) mRow.findViewById(R.id.name_textview);
                return mNameTextView;
            }
    
        }
    
    }
    
    .

Dai un'occhiata a questo thread Rimuovi-accenti-da-stringa e Android normalizer class

[modifica] Oppure potresti provare unione-adattatore con entrambi gli array

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top