Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AutoCompleteTextView在快速删除文本时崩溃_Android_Autocompletetextview - Fatal编程技术网

Android AutoCompleteTextView在快速删除文本时崩溃

Android AutoCompleteTextView在快速删除文本时崩溃,android,autocompletetextview,Android,Autocompletetextview,我有一个关键字列表(大约1000个单词),我将其设置为ArrayAdapter,由AutoCompleteTextView处理。基本流程运行良好。当我选择了一个长单词(上面10个字符),然后使用键盘上的退格按钮删除该单词(按住按钮),删除了5个字符后,应用程序崩溃,出现以下错误 下面是我的代码,我做错什么了吗?提前感谢您的建议:-) 公共类POIAutompleteAdapter扩展ArrayAdapter实现可过滤{ 私有列表searchTextAutoSuggestList=new A

我有一个关键字列表(大约1000个单词),我将其设置为ArrayAdapter,由AutoCompleteTextView处理。基本流程运行良好。当我选择了一个长单词(上面10个字符),然后使用键盘上的退格按钮删除该单词(按住按钮),删除了5个字符后,应用程序崩溃,出现以下错误

下面是我的代码,我做错什么了吗?提前感谢您的建议:-)

公共类POIAutompleteAdapter扩展ArrayAdapter实现可过滤{
私有列表searchTextAutoSuggestList=new ArrayList();
private SearchTextAutoSuggest DefaultSuggest=新建SearchTextAutoSuggest();
私有处理器和线程处理器;
公共POI自动完成适配器(上下文上下文、int-viewResourceId、处理程序uiThreadHandler){
super(上下文,viewsourceid);
this.uiThreadHandler=uiThreadHandler;
defaultSuggestion.setName(AppConstants.DEFAULT\u SEARCH\u STRING\u NAME);
}
@凌驾
public int getCount(){
返回searchTextAutoSuggestList.size();
}
@凌驾
public SearchTextAutoSuggest getItem(int位置){
返回searchTextAutoSuggestList.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共过滤器getFilter(){
过滤器过滤器=新过滤器(){
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults FilterResults=新的FilterResults();
已同步(filterResults){
if(约束!=null){
//清除并检索自动完成结果。
searchTextAutoSuggestList.clear();
searchTextAutoSuggestList=getFilteredResults(约束);
//将数据分配给FilterResults
filterResults.values=searchTextAutoSuggestList;
filterResults.count=searchTextAutoSuggestList.size();
}
返回过滤器结果;
}
}
@凌驾
受保护的void publishResults(CharSequence约束、最终FilterResults FilterResults){
uiThreadHandler.post(新的Runnable(){
公开募捐{
已同步(filterResults){
如果(filterResults!=null&&filterResults.count>0){
notifyDataSetChanged();
}否则{
Logs.e(“试图使无效”);
notifyDataSetionValidated();
}
}
}
});
}
};
回流过滤器;
}
私有列表getFilteredResults(CharSequence约束){
List searchTextAutoSuggestList=AppContext.searchTextAutoSuggestList;
List filteredSearchTextAutoSuggestList=新建ArrayList();
//将约束作为默认选项指定到列表中
defaultSuggestion.setLabel(getContext().getString(R.string.general\u default\u search\u str)+“\'”+约束+“\'”;
filteredSearchTextAutoSuggestList.add(默认建议);
对于(int i=0;i

因为
性能过滤
在工作线程中执行。在这个线程中分配searchTextAutoSuggestList变量,但只需在UI线程中更改适配器的数据。另外,
publishResults
方法在UI线程中执行,所以这里不需要任何处理程序

@Override
protected FilterResults performFiltering(CharSequence constraint) {
    FilterResults filterResults = new FilterResults();
    synchronized (filterResults) {
        if (constraint != null) {
            // Clear and Retrieve the autocomplete results.
            List<SearchTextAutoSuggest> resultList = getFilteredResults(constraint);

            // Assign the data to the FilterResults
            filterResults.values = resultList;
            filterResults.count = resultList.size();
        }
        return filterResults;
    }
}

@Override
protected void publishResults(CharSequence constraint, final FilterResults filterResults) {
    if (filterResults != null && filterResults.count > 0) {
        searchTextAutoSuggestList.clear();
        searchTextAutoSuggestList = filterResults.values;
        notifyDataSetChanged();
    } else {
        Logs.e("Tried to invalidate");
        notifyDataSetInvalidated();
    }

}
@覆盖
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults FilterResults=新的FilterResults();
已同步(filterResults){
if(约束!=null){
//清除并检索自动完成结果。
List resultList=getFilteredResults(约束);
//将数据分配给FilterResults
filterResults.values=结果列表;
filterResults.count=resultList.size();
}
返回过滤器结果;
}
}
@凌驾
受保护的void publishResults(CharSequence约束、最终FilterResults FilterResults){
如果(filterResults!=null&&filterResults.count>0){
searchTextAutoSuggestList.clear();
searchTextAutoSuggestList=filterResults.values;
notifyDataSetChanged();
}否则{
Logs.e(“试图使无效”);
notifyDataSetionValidated();
}
}

我也面临同样的问题,经过大量的调试和研究,我通过覆盖
notifyDataSetChanged()
并评估
建议列表的大小来解决这个问题。代码片段如下所示

private int size = 0;

     @Override
        public void notifyDataSetChanged() {
             size = suggestionList.size();
            super.notifyDataSetChanged();
        }
…然后在
getCount()中返回大小:

…过滤代码如下所示:

 private class CustomFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            suggestions.clear();
            FilterResults filterResults = new FilterResults();
            try {

                    if (originalList != null && constraint != null) { // Check if the Original List and Constraint aren't null.
                        try {
                            for (int i = 0; i < originalList.size(); i++) {
                                // if (originalList.get(i).toLowerCase().contains(constraint)) {
                                if (originalList.get(i).toLowerCase().contains(constraint.toString().toLowerCase())) {
                                    suggestionList.add(originalList.get(i)); // If TRUE add item in Suggestions.
                                }
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } else {
                        notifyDataSetChanged();
                    }

            } catch (Exception e) {
                e.printStackTrace();
            }
           // Create new Filter Results and return this to publishResults;
            filterResults.values = suggestionList;
            filterResults.count = suggestionList.size();

            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
           if (results != null && results.count > 0) {
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }
        }
    }
私有类CustomFilter扩展了筛选器{
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
建议。清晰();
FilterResults FilterResults=新的FilterResults();
试一试{
如果(originalList!=null&&constraint!=null){//检查原始列表和约束是否不是null。
试一试{
对于(int i=0;iprivate int size = 0;

     @Override
        public void notifyDataSetChanged() {
             size = suggestionList.size();
            super.notifyDataSetChanged();
        }
@Override
    public int getCount() {

        return size; // Return the size of the suggestions list.
    }
 private class CustomFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            suggestions.clear();
            FilterResults filterResults = new FilterResults();
            try {

                    if (originalList != null && constraint != null) { // Check if the Original List and Constraint aren't null.
                        try {
                            for (int i = 0; i < originalList.size(); i++) {
                                // if (originalList.get(i).toLowerCase().contains(constraint)) {
                                if (originalList.get(i).toLowerCase().contains(constraint.toString().toLowerCase())) {
                                    suggestionList.add(originalList.get(i)); // If TRUE add item in Suggestions.
                                }
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } else {
                        notifyDataSetChanged();
                    }

            } catch (Exception e) {
                e.printStackTrace();
            }
           // Create new Filter Results and return this to publishResults;
            filterResults.values = suggestionList;
            filterResults.count = suggestionList.size();

            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
           if (results != null && results.count > 0) {
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }
        }
    }
   class SuggestionsFilter: Filter {

    string[] temp_matchitems_foradapter = new string[1];
    eArrayAdapter customAdapter;
    public SuggestionsFilter(eArrayAdapter adapter): base() {
     customAdapter = adapter;
    }
    protected override Filter.FilterResults PerformFiltering(Java.Lang.ICharSequence constraint) {
     FilterResults results = new FilterResults();
     if (constraint != null) {
      var searchFor = constraint.ToString();

      var matches = customAdapter.AllItems.Where(i =>  i.ToString().IndexOf(searchFor) >= 0 );


      #region  !!!!! FOCUS HEREEEEEEEEEE !!!!!      
      // WRONG----  dont update  adapter here. 
      //adapter.matchitems=  matches.ToArray();
      // RİGHT
      temp_matchitems_foradapter = matches.ToArray();
      #endregion 

      //this doesnt populate filtered view
      results.Values = FromArray(matches.Select(r => r.ToJavaObject()).ToArray());;
      results.Count = matches.Count();
     }
     return results;
    }

    protected override void PublishResults(Java.Lang.ICharSequence constraint, Filter.FilterResults results) 
    {
     //  update customAdapter.matchitems here  and notifychanges
     customAdapter.MatchItems = tempmathitems_foradapter;
     customAdapter.NotifyDataSetChanged();
    }