BaseAdapterを拡張し、Filterableインターフェイスを実装してカスタムアダプタを作成しました。このアダプタは、連絡先番号または連絡先の名前を入力するときに、ユーザーに電話番号を提示するために使用されます。 ArrayList<String> data
には、電話機から抽出された「人名:番号」のパターンのデータが含まれています。AutoCompleteTextView用に作成されたカスタムアダプタのデータを更新する
1つの問題を除いて動作しています。私が連絡先を検索する場合、文字 "A"で始めると、データが正しく表示されます。それを削除して「B」をもう一度入力すると、両方の連絡先が「A」と「B」で始まることが示されます。私は新しいデータを追加する前にいくつかのメソッドでArrayList<String> matchedResults
(コードをチェックする)をクリアする必要があることを知っていますが、私がそれをしたときに空のArrayListを与えました。どちらの方法で、私はそれを行うべきか、それともこのための別の解決方法がありますか?
ここにコード
public class AutoCompleteAdapter extends BaseAdapter implements Filterable {
private Context context;
private ArrayList<String> data;
private ArrayList<String> matchedResults = new ArrayList<String>();
public AutoCompleteAdapter(Context context, ArrayList<String> namesAndNumbers) {
this.context = context;
this.data = namesAndNumbers;
}
@Override
public int getCount() {
return matchedResults.size();
}
@Override
public String getItem(int position) {
return matchedResults.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.custom_layout, parent, false);
TextView nameTextView = (TextView) view.findViewById(R.id.name);
TextView numberTextView = (TextView) view.findViewById(R.id.number);
String[] split = matchedResults.get(position).split(":");
nameTextView.setText(split[0]);
numberTextView.setText(split[1]);
return view;
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if(constraint != null || constraint.length() != 0) {
for (String loop:data) {
int charSequenceSize = constraint.length();
if(onlyText(constraint.toString()) && !matchedResults.contains(loop)){
String[] split = loop.split(":");
String substring = split[0].substring(0, charSequenceSize);
if (substring.equalsIgnoreCase(constraint.toString())){
matchedResults.add(loop);
}
}else if(onlyNumbers(constraint.toString())){
String[] split = loop.split(":");
String substring = split[1].substring(0, charSequenceSize);
if (substring.equals(constraint.toString()) && !matchedResults.contains(loop)){
matchedResults.add(loop);
}
}
}
}
results.values = matchedResults;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
results.values = matchedResults;
notifyDataSetChanged();
}
};
}
public boolean onlyText(String text) {
boolean result = false;
if (Pattern.matches("[a-zA-Z ]+", text) && text.length() >= 1) {
result = true;
}
return result;
}
public boolean onlyNumbers(String text) {
boolean result = false;
if (Pattern.matches("[0-9+]+", text) && text.length() >= 1) {
result = true;
}
return result;
}
}
'SimpleCursorAdapter'を使用し、' FilterQueryProvider'をセットアップします。なぜカーソルベースのデータモデルを扱うときに 'BaseAdapter'を使用しますか? – pskink