title: Extending ArrayAdapter in android
body: <p>I need to override a <code>getFilter()</code> method from the class <code>ArrayAdapter</code>  and i found the source code from <a href="https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/ArrayAdapter.java" rel="noreferrer">here in the github</a> </p>
  
  <pre><code>//package name
  
  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;
  import android.widget.Filterable;
  
  public class CustomAdapter&lt;T&gt; extends ArrayAdapter&lt;T&gt; implements Filterable{
  
      private ArrayList&lt;T&gt; mOriginalValues;
      private List&lt;T&gt; 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);
          // 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 ---&gt; " + prefix);
              if (mOriginalValues == null) {
                  synchronized (mLock) {
                      mOriginalValues = new ArrayList&lt;T&gt;(mObjects);
                  }
              }
  
              if (prefix == null || prefix.length() == 0) {
                  ArrayList&lt;T&gt; list;
                  synchronized (mLock) {
                      list = new ArrayList&lt;T&gt;(mOriginalValues);
                  }
                  results.values = list;
                  results.count = list.size();
              } else {
                  String prefixString = prefix.toString().toLowerCase();
  
                  ArrayList&lt;T&gt; values;
                  synchronized (mLock) {
                      values = new ArrayList&lt;T&gt;(mOriginalValues);
                  }
  
                  final int count = values.size();
                  final ArrayList&lt;T&gt; newValues = new ArrayList&lt;T&gt;();
                  final ArrayList&lt;T&gt; approxValues = new ArrayList&lt;T&gt;();
                  final ArrayList&lt;T&gt; secondApproxValues = new ArrayList&lt;T&gt;();
  
  
                  for (int i = 0; i &lt; 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 &lt; wordCount; k++) {
                              if (words[k].startsWith(prefixString)) {
                                  newValues.add(value);
                                  flag = false;
                                  break;
                              } 
                          }
                      }
  
                      if(flag) {
                          if(approxMatch(valueText, prefixString) &lt;= 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 &lt; wordCount; k++) {
                                  if(approxMatch(words[k], prefixString) &lt;= 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&lt;T&gt;) results.values;
              if (results.count &gt; 0) {
                  notifyDataSetChanged();
              } else {
                  notifyDataSetInvalidated();
              }
          }
      }
  
      private int approxMatch (String s, String t) {
            // an approxmimate string matching algo
            return p;
      }
  }
  </code></pre>
  
  <p>The problem is the getFilter method has a object of a private inner class <code>ArrayFilter</code> which has a method <code>peformFiltering</code> and i need to put a different code there so i have to overide the class. And i get an exception in the method. </p>
  
  <p>In the derived class which extends ArrayAdapter i created a private inner class which is similar to <code>ArrayFilter</code> and called it <code>MyFilter</code> and i get the same exception again in the method <code>performFiltering</code>.</p>
  
  <p>I found a solution to solve my problem. I copied all the code in <code>ArrayAdapter</code> class and created a new class called <code>MyAdapter</code> and i altered some code inside the inner class <code>ArrayFilter</code> and the app works the way i wanted it to. But i feel its not the best solution.</p>
  
  <p>Android has various api levels so if the array adapter is changed in different api level then i have to add those changes in my codes to. So i feel the best way is to extend the class <code>ArrayAdapter</code> to create <code>MyAdapter</code> rather than just copying and pasting the code from the <code>ArrayAdapter</code></p>
  
  <p>How can i  override the inner private class  of a parent class..?</p>
  
  <p>Edit: The exception i get..
  <img src="https://i.stack.imgur.com/IbUXw.png" alt="Exception"></p>
  
  <p>Edit2: Now i added the full code in the question. and it works perfectly if i copy and edit the array adapter.. the problem is only when i extend..!! now the code and search is working perfectly. I checked it with <code>Log.i</code>.. but the drop down list for auto complete suggestion in UI is not working.. i only get for the first character i type the next character filtering takes place but UI update is not taking place.</p>