我已經創建了自己的適配器,它擴展了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?那爲什麼會發生呢?
它很明顯,我在這裏得到了一些錯誤,或者我不完全明白這是如何工作的。