我有一个自定义performFiltering,用于获取新数据并过滤它的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;
我在AutoCompleteTextView中第1350行的Android源代码中跟踪了以下错误,执行了以下操作:
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>
答案 0 :(得分:0)
好的我管理了一个解决方案,所以这里:
而不是自定义过滤器,我使用常规适配器,在asynctask获取新数据后,我在onPostExcecute中更新。在结果上,我创建了一个新的适配器并将其设置为autocompletetextview。此外,我只对2个字符执行新的搜索,以保持流量下降。
诀窍是让自动完成实际显示某些东西,因为当用户开始输入时它没有数据。通过设置新的适配器并执行.showDropdown,它可以工作,但数据没有过滤到实际类型的数据,因为用户会在初始2之后键入更多的字符。
通过将autocompletetextview文本设置为其所具有的文本来解决此问题,从而强制刷新过滤和下拉数据。这里的关键是使用来自afterTextChange的文本(我正在使用textchange监听器)使用setText,然后调用setSelection(newText.length())将光标放在正确的位置。
我在这里提交的问题尚未解决,因为我正在以新的方式进行数据处理,似乎处理过滤器内的自动完成数据不是一个好主意,因为它是线程化的并且在工作时期望不可变数据,据我所知。