Фатальное исключение ClassCastException с автозаполнением раскрывающегося списка просмотра при выполнении фильтра - PullRequest
0 голосов
/ 22 июня 2011

У меня есть пользовательский 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 Ответ

0 голосов
/ 24 июня 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...