コードに問題があります。アダプタ内のHashMapを検索します。正常に動作しますが、EditTextのすべての文字をすばやく削除すると、アダプタには、すべての要素のリストではなく、入力された最初の文字列全体のリストが表示されます。
例:Jamesと入力すると、ビューはマップ内のすべてのJamesを取得しますが、EditTextをすばやく削除すると(押し戻す)、メソッドはすぐに検索を実行し、任意のサブ文字列(jame、jam、ja、 j)しかし最後に、彼は完全な連絡先リストではなく、「ジェームズ」を継承したリストを再び表示します
回答ありがとうございます!
public class ContactsActivity extends ListActivity {
private HashMap<String, UserEntry> all_map_jid=new HashMap<String, UserEntry>();
private ArrayList<String> all_mkey=new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contacts);
getListView().setTextFilterEnabled(true);
final EditText searchText = (EditText) findViewById(R.id.searchbox);
TextWatcher textWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//... your logic
adapter.getFilter().filter(s.toString());
}
@Override
public void afterTextChanged(Editable arg0) {
// ... your logic
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// ... your logic
}
};
searchText.addTextChangedListener(textWatcher);}
public class RosterAdapter extends BaseAdapter implements Filterable{
//private ViewHolder holder;
private LayoutInflater inflater;
private HashMap<String, UserEntry> mappa_users=null;
private ArrayList<String> mKeys;
public RosterAdapter(){
this.mappa_users =new HashMap<String, UserEntry>();
this.inflater= (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.mKeys=new ArrayList<String>();
}
@Override
public int getCount() {
return mappa_users.size();
}
@Override
public UserEntry getItem(int position) {
return mappa_users.get(mKeys.get(position));
}
@Override
public long getItemId(int arg0) {
return arg0;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.layout_row, null);
// Creates a ViewHolder and store references to the two children
// views we want to bind data to.
holder = new ViewHolder();
holder.username = (TextView) convertView.findViewById(R.id.user_info);
holder.availability = (ImageView) convertView.findViewById(R.id.user_availability);
holder.user_ic = (ImageView) convertView.findViewById(R.id.icon);
// Keep track of the view holder as a tag of the view
convertView.setTag(holder);
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
holder = (ViewHolder) convertView.getTag();
}
String user = getItem(position).getUserName();
//Log.e("Nome","username "+user);
holder.username.setText(user);
if(!(getItem(position).getUserStatus())){
System.out.println("unavailable");
holder.availability.setImageResource(R.drawable.ic_not_available);
}else{
holder.availability.setImageResource(R.drawable.ic_available);
}
//do your view stuff here
return convertView;
}
@Override
public Filter getFilter() {
return new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mappa_users = (HashMap<String,UserEntry>) results.values;
mKeys= new ArrayList<String>(Arrays.asList(mappa_users.keySet().toArray(new String[mappa_users.size()])));
Collections.sort(mKeys, new RosterEntryComparator(mappa_users));
notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
HashMap<String,UserEntry> searched_user=new HashMap<String,UserEntry>();
FilterResults results = new FilterResults();
if (constraint!= null && constraint.toString().length() > 0) {
SmithWaterman metric = new SmithWaterman();
for(String element : all_mkey){
//La mappa dell'adapter è riempito con le sole entry simily all'occorrenza ricercata
if (metric.getSimilarity(constraint.toString().toLowerCase(), all_map_jid.get(element).getUserName().toLowerCase()) >= 0.8 ){
UserEntry rEntry=all_map_jid.get(element);
searched_user.put(element, rEntry );
}
}
results.values = searched_user;
results.count = searched_user.size();
}
else{
results.values = all_map_jid;
results.count = all_map_jid.size();
}
return results;
}
};
}