1

コードに問題があります。アダプタ内の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;
            }
        };
    }
4

1 に答える 1