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); 

並解決問題!