Extending ArrayAdapter in android

前端 未结 4 1426
Happy的楠姐
Happy的楠姐 2020-12-09 09:37

I need to override a getFilter() method from the class ArrayAdapter and i found the source code from here in the github

//package         


        
4条回答
  •  失恋的感觉
    2020-12-09 10:09

    Perhaps this may help you:

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import android.content.Context;
    import android.util.Log;
    import android.widget.ArrayAdapter;
    import android.widget.Filter;
    
    public class CustomAdapter extends ArrayAdapter {
    
        private final ArrayList mOriginalValues;
        private List mObjects;
        private CustomFilter mFilter;
        private final Object mLock = new Object();
        public CustomAdapter(Context context, int textViewResourceId, T[] objects) {
            super(context, textViewResourceId, objects);
    
            mObjects = Arrays.asList(objects);
            mOriginalValues = (ArrayList) Arrays.asList(objects);
            // TODO Auto-generated constructor stub
        }
    
        @Override
        public Filter getFilter() {
            // TODO Auto-generated method stub
            if (mFilter == null) {
                mFilter = new CustomFilter();
            }
            return mFilter;
        }
    
    
        private class CustomFilter extends Filter {
            @Override
            protected FilterResults performFiltering(CharSequence prefix) {
                FilterResults results = new FilterResults();
                Log.d("bajji", "its ---> " + prefix);
    
                if (prefix == null || prefix.toString().trim().length() == 0) {
                    ArrayList list;
                    synchronized (mLock) {
                        list = new ArrayList(mOriginalValues);
                    }
                    results.values = list;
                    results.count = list.size();
                } else {
                    String prefixString = prefix.toString().toLowerCase();
    
                    ArrayList values;
                    synchronized (mLock) {
                        values = new ArrayList(mOriginalValues);
                    }
    
                    final int count = values.size();
                    final ArrayList newValues = new ArrayList();
                    final ArrayList approxValues = new ArrayList();
                    final ArrayList secondApproxValues = new ArrayList();
    
    
                    for (int i = 0; i < count; i++) {
                        final T value = values.get(i);
                        final String valueText = value.toString().toLowerCase();
                        boolean flag = true;
                        // First match against the whole, non-splitted value
                        if (valueText.startsWith(prefixString)) {
                            newValues.add(value);
                            flag = false;
                        } else {
                            final String[] words = valueText.split(" ");
                            final int wordCount = words.length;
    
                            // Start at index 0, in case valueText starts with space(s)
                            for (int k = 0; k < wordCount; k++) {
                                if (words[k].startsWith(prefixString)) {
                                    newValues.add(value);
                                    flag = false;
                                    break;
                                } 
                            }
                        }
    
                        if(flag) {
                            if(approxMatch(valueText, prefixString) <= 3) { //change the stuff and do a levi work
                                approxValues.add(value);
                            }
                            else {
                                final String[] words = valueText.split(" ");
                                final int wordCount = words.length;
    
                                // Start at index 0, in case valueText starts with space(s)
                                for (int k = 0; k < wordCount; k++) {
                                    if(approxMatch(words[k], prefixString) <= 3) {
                                        //leve work
                                        secondApproxValues.add(value);
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    newValues.addAll(approxValues);
                    newValues.addAll(secondApproxValues);
                    results.values = newValues;
                    results.count = newValues.size();
                }
                return results;
            }
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                //noinspection unchecked
                mObjects = (List) results.values;
                notifyDataSetChanged();
                clear();
                for(T tmp : mObjects){
                    add(tmp);
                }
    
                notifyDataSetChanged();
            }
        }
    
        private int approxMatch (String s, String t) {
              // an approxmimate string matching algo
              return p;
        }
    }
    

    Now in getView method of adapter, you need to refer to mObjects object to get recent available values for ListView

提交回复
热议问题