BaseAdapter を拡張して Filterable を実装する独自のアダプターを作成しました。
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、サイズは 1 です」と表示されます。
私の意見:通常、高速で入力しているときに発生するため、NotifyDataSetChangedが進行中であると想定していますが、publishResultsがarrayListの内容を変更し、これがエラーを引き起こします. しかし、もう一度、これがより多くの状況で起こると思いますか?
また、別のエラーが表示されます: The content of the adapter has changed but ListView does not receive the notifications. アダプターのコンテンツがバックグラウンド スレッドからではなく、UI スレッドからのみ変更されていることを確認してください。
何かご意見は?