Неустранимое исключение ClassCastException с автозаполнением раскрывающегося списка просмотра при выполнении фильтра

У меня есть пользовательский executeFiltering для AutoCompleteTextView, который выбирает новые данные и фильтрует их:

@Override
    protected FilterResults performFiltering(CharSequence constraint) {

        FilterResults filterResults = new FilterResults();

        if (null != constraint && constraint.length() >= 2) {

            ArrayList<Destination> temporaryDestination = updateArray();

            filterResults.count = temporaryDestination.size();
            filterResults.values = temporaryDestination;



            return filterResults;

        } else {

            if (destinations != null) {

                filterResults.count = destinations.size();
                filterResults.values = destinations;
            }

            return filterResults;
        }
    }

Если я наберу две буквы, которые получат много пунктов назначения и прокрутят вниз, я получу FC и следующую трассировку стека:

06-22 14:44:07.756: ERROR/AndroidRuntime(2188): FATAL EXCEPTION: main
    java.lang.ClassCastException: android.widget.AbsListView$LayoutParams
    at android.widget.AutoCompleteTextView.buildDropDown(AutoCompleteTextView.java:1350)
    at android.widget.AutoCompleteTextView.showDropDown(AutoCompleteTextView.java:1140)
    at android.widget.AutoCompleteTextView.onKeyDown(AutoCompleteTextView.java:714)
    at android.view.KeyEvent.dispatch(KeyEvent.java:1256)
    at android.view.View.dispatchKeyEvent(View.java:3855)
    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1687)
    at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1120)
    at android.app.Activity.dispatchKeyEvent(Activity.java:2073)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1663)
    at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2560)
    at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2535)
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1867)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3683)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    at dalvik.system.NativeStart.main(Native Method)

Если я верну максимум 5 результатов, это будет нормально работать (я просто добавлю следующее):

            if (null != constraint && constraint.length() >= 2) {

            ArrayList<Destination> temporaryDestination = updateArray();

            if (temporaryDestination.size()>5) {
                temporaryDestination = new ArrayList<Destination>(temporaryDestination.subList(0, 5));
            }

            filterResults.count = temporaryDestination.size();
            filterResults.values = temporaryDestination;

Я отследил ошибку до следующего в Исходном коде Android в строке 1350 в AutoCompleteTextView, который выполняет следующие действия:

        if (view != null) {
            LinearLayout.LayoutParams hintParams =
                    (LinearLayout.LayoutParams) view.getLayoutParams();
            otherHeights = view.getMeasuredHeight() + hintParams.topMargin
                    + hintParams.bottomMargin;
        }
    }

Однако я не понимаю, почему этот код получает неправильный класс, когда результаты больше 5, и вы начинаете прокручивать. Решение ограничить результаты до 5 ужасно, так как я чувствую, что настоящая проблема все еще существует. У кого-нибудь есть предложения?

Вот макет xml для элементов автозаполнения (но без пользовательской реализации раскрывающегося списка):

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >

<TextView
      android:id="@+id/textView"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:padding="10dp"
      android:textSize="16sp"
      android:textColor="#000">

</TextView>
</RelativeLayout>

1 ответ

Хорошо, я справился с решением, вот так:

Вместо настраиваемого фильтра я использую обычный адаптер, который я обновляю в onPostExcecute после того, как асинктическая задача получила новые данные. В результате я создаю новый адаптер и устанавливаю его в autocompletetextview. Также я выполняю только новые поиски по 2 символам только для того, чтобы уменьшить трафик.

Хитрость заключается в том, чтобы автозаполнение действительно показывало что-то, поскольку у него нет данных, когда пользователь начинает печатать. Установив новый адаптер и выполнив.showDropdown, он сработал, но данные не были отфильтрованы до фактических введенных данных, потому что пользователь будет вводить больше символов после начальных 2.

Это было решено путем установки для текста автозаполнения текстового представления того текста, который у него есть, что привело к обновлению данных фильтрации и раскрывающихся списков. Ключевым моментом здесь является использование текста из afterTextChange (я использую слушатель textchange), использующего setText, а затем вызов setSelection(newText.length()), чтобы поместить курсор в правильное место.

Проблема, которую я здесь изложил, не была решена, так как я делаю передачу данных по-новому, кажется, что обработка данных автозаполнения внутри фильтра не очень хорошая идея, потому что они многопоточные и ожидают неизменных данных при работе, насколько это возможно. как я могу сказать.

Другие вопросы по тегам