0

我已经创建了自己的适配器,它扩展了BaseAdapter实现Filterable。AutoCompleteTextView的自定义布局和过滤器

我偶尔得到索引越界的错误,在getView方法:

private ArrayList<ResultHolderData> originalData; 
    private ArrayList<ResultHolderData> arrayList; 
    private LayoutInflater inflater; 
    private ArrayList<ResultHolderData> suggestions; 


    public static class ResultHolderData { 
    public String symbol; 
    public String fullName; 
    public ResultHolderData(String a, String b) { 
      symbol=a; 
      fullName=b; 
    } 
    } 

public static class ResultHolder { 
     public TextView symName; 
     public TextView symNameFull; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ResultHolder rh; 

if(convertView==null) { 
    rh=new ResultHolder(); 
    convertView=inflater.inflate(R.layout.two_line_dropdown_item, null); 
    rh.symName=(TextView) convertView.findViewById(R.id.autocompleteSym); 
    rh.symNameFull=(TextView) convertView.findViewById(R.id.autocompleteName); 
    convertView.setTag(rh); 
} else { 
    rh=(ResultHolder) convertView.getTag(); 
} 

//rh.symName.setTextColor(Color.GREEN); 

/***THE BELLOW LINE THROWS THE ERROR***/ 
rh.symName.setText(arrayList.get(position).symbol); 
rh.symNameFull.setText(arrayList.get(position).fullName); 
//rh.symName.setText(arrayList.get(position)); 

return convertView; 
} 

ArrayList中表示滤波后的resultSet:

 @SuppressWarnings("unchecked") 
@Override 
protected void publishResults(CharSequence constraint,FilterResults results) { 
    if(results.count>0 && results!=null) { 
     arrayList=(ArrayList<ResultHolderData>) results.values; 
     notifyDataSetChanged(); 
    } else { 
     notifyDataSetInvalidated(); 
    } 

} 

出现的错误,有时,当你在下拉建议中有2个项目,并且在输入另一个字母时会导致下拉列表只显示一个项目。于是说:无效指数1,大小为1或大小为0 ..


我的看法:通常当我快我打字发生,所以我认为NotifyDataSetChanged正在进行中,但publishResults改变arrayList的内容,这会导致错误。但是,我希望在更多情况下会发生这种情况?

2.弹出另一个错误:适配器的内容已更改,但ListView未收到通知。确保适配器的内容不会从后台线程修改,而只能从UI线程修改。

而我更改适配器的内容的唯一地方是在publishResults?那为什么会发生呢?

它很明显,我在这里得到了一些错误,或者我不完全明白这是如何工作的。

回答

0

因为我张贴同样的问题两次,当我绝望了,这里是我答曰:Errors with custom BaseAdapter for AutoCompleteTextView(indexOutOfBounds & content changed but no notification)

的问题是这一行publishResults:

arrayList=(ArrayList<ResultHolderData>) results.values; 

刚刚指出的ArrayList到这些结果,相反,我做了一个“浅拷贝”,并清除它之前的清单:

arrayList.clear(); 
    for(ResultHolderData tempRhd : (ArrayList<ResultHolderData>)results.values) 
      arrayList.add(tempRhd); 

并解决问题!