Note that there are some explanatory texts on larger screens.

plurals
  1. POExtending ArrayAdapter in android
    text
    copied!<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>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload