0

autocompletetextview でテキストをフィルタリングしたい。テキストの入力を開始すると、フィルター処理されたテキストを表示する代わりに、テキストの完全なリストが表示されます。つまり、リストをフィルタリングしません。

問題を解決するのを手伝ってください。試しましたが、問題を認識できませんでした

public class AutoCompleteAdapter extends ArrayAdapter<String> implements Filterable {
    private ArrayList<String> mData;

    public AutoCompleteAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
        mData = new ArrayList<String>();
        mData.add("one");
        mData.add("oneee");
        mData.add("two");
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public String getItem(int index) {
        return mData.get(index);
    }

    @Override
    public Filter getFilter() {
        Filter myFilter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                List<String> resultsSuggestions = new ArrayList<String>();
                if(constraint != null) {
                    for (int i = 0; i < getCount(); i++) {
                        if(getItem(i).toString().startsWith(constraint.toString())){
                            resultsSuggestions.add(getItem(i).toString());
                        }
                    }
                }
                FilterResults results = new FilterResults();
                results.values = resultsSuggestions;
                results.count = resultsSuggestions.size();
                return results;
            }

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence contraint, FilterResults results) {
                try {
                    ArrayList<String> newValues = (ArrayList<String>) results.values;
                    for (int i = 0; i < newValues.size(); i++) {
                        add(newValues.get(i));
                    }

                    if(results != null && results.count > 0) {
                        notifyDataSetChanged();
                    }
                    else {
                        notifyDataSetInvalidated();
                    }
                } catch(Exception e) {
                    Log.v("Near ATM", "Exception ::" + e.getMessage());
                }
            }
        };
        return myFilter;
    }
}
4

1 に答える 1

0

あなたの問題はpublishResults方法にあると思います。notifyDataSetChanged()の場合でも呼び出す必要がありますresult.count == 0。そして、getItemメソッドgetCountはフィルタリングされたリストで動作するはずです。したがって、コードは次のようになります。

public class AutoCompleteAdapter extends ArrayAdapter<String> implements Filterable {
private ArrayList<String> fullList;
private ArrayList<String> filtredList;

public AutoCompleteAdapter(Context context, int textViewResourceId) {
    super(context, textViewResourceId);
    filtredList = new ArrayList<String>();
    fullList = new ArrayList<String>();
    fullList.add("one");
    fullList.add("oneee");
    fullList.add("two");
}

@Override
public int getCount() {
    return filtredList.size();
}

@Override
public String getItem(int index) {
    return filtredList.get(index);
}

@Override
public Filter getFilter() {
    Filter myFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<String> resultsSuggestions = new ArrayList<String>();
            if(constraint != null) {
                for (int i = 0; i < fullList.size(); i++) {
                    if(fullList.get(i).startsWith(constraint.toString())){
                        resultsSuggestions.add(fullList.get(i));
                    }
                }
            }
            FilterResults results = new FilterResults();
            results.values = resultsSuggestions;
            results.count = resultsSuggestions.size();
            filtredList = resultsSuggestions;
            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence contraint, FilterResults results) {
            try {
                ArrayList<String> newValues = (ArrayList<String>) results.values;
                for (int i = 0; i < newValues.size(); i++) {
                    add(newValues.get(i));
                }

                if(results != null) {
                    notifyDataSetChanged();
                }
                else {
                    notifyDataSetInvalidated();
                }
            } catch(Exception e) {
                Log.v("Near ATM", "Exception ::" + e.getMessage());
            }
        }
    };
    return myFilter;
}

}

于 2013-07-14T08:00:35.983 に答える