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