简体   繁体   English

Android:AutoCompleteTextView和过滤器 - 键入延迟 - 为什么?

[英]Android: AutoCompleteTextView and Filter - Typing Delay - Why?

Alright guys, this is driving me crazy and I cannot find a solution on the internet! 好吧,伙计们,这让我发疯,我无法在互联网上找到解决方案!
I did a new Eclipse project and pasted this code inside: 我做了一个新的Eclipse项目,并在里面粘贴了这个代码:

https://developers.google.com/places/training/autocomplete-android https://developers.google.com/places/training/autocomplete-android

It works, but if I enter or delete (a) character(s) there is mostly a delay(short freeze) while typing them and the suggestions-dropdown disappears and appears again mostly. 它可以工作,但是如果我输入或删除(a)字符,那么在键入它们时大多会有延迟(短暂冻结)并且建议 - 下拉消失并且大部分再次出现。
As for my understanding, the filtering itself is done asynchronously, hence from a background thread, so why the short freezes? 至于我的理解,过滤本身是异步完成的,因此来自后台线程,为什么短暂的冻结呢?

My goal is to have a freeze-free AutoCompleteTextView like in Google Play Store. 我的目标是在Google Play商店中拥有一个无冻结的AutoCompleteTextView。
So do you guys have any advices/workarounds for achieving this? 所以你们有任何建议/解决方法来实现这一目标吗?

You must use the following library file.you have to call addTextChangeListener(Listener) on AutoCompletetextView. 您必须使用以下库文件。您必须在AutoCompletetextView上调用addTextChangeListener(Listener) Inside afterTextChanged(Editable s) you have to mention the functionalities you need to do. afterTextChanged(Editable s)里面你必须提到你需要做的功能。

/*
 * Copyright (C) 2006 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.text;

/**
 * When an object of a type is attached to an Editable, its methods will
 * be called when the text is changed.
 */
public interface TextWatcher extends NoCopySpan {
    /**
     * This method is called to notify you that, within <code>s</code>,
     * the <code>count</code> characters beginning at <code>start</code>
     * are about to be replaced by new text with length <code>after</code>.
     * It is an error to attempt to make changes to <code>s</code> from
     * this callback.
     */
    public void beforeTextChanged(CharSequence s, int start,
                                  int count, int after);
    /**
     * This method is called to notify you that, within <code>s</code>,
     * the <code>count</code> characters beginning at <code>start</code>
     * have just replaced old text that had length <code>before</code>.
     * It is an error to attempt to make changes to <code>s</code> from
     * this callback.
     */
    public void onTextChanged(CharSequence s, int start, int before, int count);

    /**
     * This method is called to notify you that, somewhere within
     * <code>s</code>, the text has been changed.
     * It is legitimate to make further changes to <code>s</code> from
     * this callback, but be careful not to get yourself into an infinite
     * loop, because any changes you make will cause this method to be
     * called again recursively.
     * (You are not told where the change took place because other
     * afterTextChanged() methods may already have made other changes
     * and invalidated the offsets.  But if you need to know here,
     * you can use {@link Spannable#setSpan} in {@link #onTextChanged}
     * to mark your place and then look up from here where the span
     * ended up.
     */
    public void afterTextChanged(Editable s);
}

I solved it by placing these lines of code (see comments): 我通过放置这些代码行来解决它(请参阅注释):

            @Override
            protected FilterResults performFiltering(CharSequence constraint)
            {
                FilterResults filterResults = new FilterResults();

                // ADDED CODE: TO FIX ERROR "The content of the adapter has changed but ListView did not receive a notification":
                ArrayList <String> resultListTemp = new ArrayList <String> ();

                if (constraint != null)
                {
                    // ADDED CODE: TO STOP TYPING DELAY & TO FIX ERROR: "The content of adapter has changed but ListView did not receive a notification"
                    if (conn != null)
                    {
                        conn.disconnect();
                    }

                    // CHANGED CODE: TO FIX ERROR "The content of the adapter has changed but ListView did not receive a notification":
                    resultListTemp.addAll(autocomplete(constraint.toString()));

                    filterResults.values = resultListTemp;
                    filterResults.count = resultListTemp.size();
                }
                return filterResults;
            }


            @Override
            protected void publishResults(CharSequence constraint, FilterResults results)
            {
                // ADDED CODE: TO FIX ERROR "The content of the adapter has changed but ListView did not receive a notification":
                resultList = (ArrayList <String>) results.values;

                if (results != null && results.count > 0)
                {
                    notifyDataSetChanged();
                }
                else
                {
                    notifyDataSetInvalidated();
                }
            }


            private ArrayList<String> autocomplete(String input)
            {
                // CHANGED CODE: TO FIX ERROR "The content of the adapter has changed but ListView did not receive a notification":
                ArrayList<String> resultList = new ArrayList <String> ();
                .....
                .....
            }



Where "conn" is the HttpURLConnection for fetching the Google Places data. 其中“conn”是用于获取Google商家信息数据的HttpURLConnection。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM