2016-04-03 18 views
0

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; 
} 
} 
+0

'SimpleCursorAdapter'を使用し、' FilterQueryProvider'をセットアップします。なぜカーソルベースのデータモデルを扱うときに 'BaseAdapter'を使用しますか? – pskink

答えて

0

は、だからあなたのコード全体は、それがこのようなことこの

@Override 
public Filter getFilter() { 
    return nameFilter; 
} 

Filter nameFilter = new Filter() { 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     if (constraint != null) { 
      matchedResults.clear(); 
      for (String item : data) { 
       if (item.toLowerCase().startsWith(constraint.toString().toLowerCase())) { 
        matchedResults.add(item); 
       } 
      } 
      FilterResults filterResults = new FilterResults(); 
      filterResults.values = matchedResults; 
      filterResults.count = matchedResults.size(); 
      return filterResults; 
     } else { 
      return new FilterResults(); 
     } 
    } 

    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     ArrayList<String> filteredList = (ArrayList<String>) results.values; 
     if (results != null && results.count > 0) { 
      data.clear(); 
      for (String c : filteredList) { 
       data.add(c); 
      } 
      notifyDataSetChanged(); 
     } 
    } 
}; 

にあなたのフィルタを更新します:私はしたいと考えてい

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 nameFilter; 
} 

Filter nameFilter = new Filter() { 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     if (constraint != null) { 
      matchedResults.clear(); 
      for (String item : data) { 
       if (item.toLowerCase().startsWith(constraint.toString().toLowerCase())) { 
        matchedResults.add(item); 
       } 
      } 
      FilterResults filterResults = new FilterResults(); 
      filterResults.values = matchedResults; 
      filterResults.count = matchedResults.size(); 
      return filterResults; 
     } else { 
      return new FilterResults(); 
     } 
    } 

    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     ArrayList<String> filteredList = (ArrayList<String>) results.values; 
     if (results != null && results.count > 0) { 
      data.clear(); 
      for (String c : filteredList) { 
       data.add(c); 
      } 
      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; 
} 

}

あなたに役立つ。

+0

ありがとう、それは動作しませんでした。それは、私が検索したもの以外のすべてのデータフォームデータArray Listを削除します。私は別の文字で別のデータセットを開始するために2回目を検索しようとすると、データ配列リストはその情報を持っていません。 –

+0

私はこのコードをArrayAdapterとそれを試してみてください。 ** data **の代わりに** publishResults ** 'matchedResults.clear()'と 'matchedResults.add'で使用してみてください –

関連する問題