Пользовательский android.widget.Filter - PullRequest
0 голосов
/ 01 февраля 2012

Я реализовал это решение для фильтрации своих ListView, но я использую испанские слова и, как вы знаете, они могут иметь акценты (например, Árbol, Avión и т. Д.) И я 'Я хотел бы отфильтровать мой ListView с нечувствительным регистром, если я напишу avion, это даст мне Avión как возможный результат, потому что он игнорирует акценты (á = a и a = Á).Для этого я использовал replaceAll java метод из java.lang.String класса, но я делаю свой фильтр таким медленным.Вы знаете альтернативы для этого?

1 Ответ

1 голос
/ 11 июня 2012

Я сделал то же самое с классом, который предоставляет отображаемую строку и преобразованную строку:

public class Element {
protected String dispString;
protected String convString;
public Element(String dispString)
    this.dispString=dispString;
    this.convString=getConvString(convString);
}

public String getDispString() {
    return dispString;
}
public String toString() {
    return convString;
}

public static String getConvString(val) {
if(val==null)
    return null;
// Do your conversion here
}

Вместо массива строк я использовал массив экземпляров класса Element.Но мне пришлось использовать метод getView () ArrayAdapter для отображения dispString вместо неявной строки toString ():

adapter=new ArrayAdapter<Element>(this, R.layout.layout_gpslocator_g_owners_child, owners) {
    public View getView(int position, View convertView, ViewGroup parent) {
        View childView=super.getView(position, convertView, parent);
        ((TextView)childView.findViewById(<child TextView id>)).setText(this.getItem(position).getDispString());
        return childView;
    }
};

Element.toString() затем используется для фильтрации.Element.getDispString() используется для отображаемой строки.А во время инициализации массива все преобразования предварительно кэшируются, и нет необходимости в преобразовании данных представления списка во время фильтрации.Вы должны позвонить Element.getConvString(val) для adapter.getFilter().filter() вызова при изменении текста.

Надеюсь, это помогло.

...