title: java import error "the type android.widget.Filter.FilterResults is not visible"
body: <p>This question was already asked: <a href="https://stackoverflow.com/questions/18135039/the-type-android-widget-filter-filterresults-is-not-visible">the type android.widget.Filter.FilterResults is not visible</a>
  But there was no clear answer, and now I'm getting the same problem. In that discussion there was something mentioned about variables being marked as final when they shouldn't be for the getFilter...
  Well, here is my code:</p>
  
  <pre><code>package com.example.project;
  
  import java.util.ArrayList;
  import java.util.Collections;
  import java.util.Comparator;
  import java.util.Locale;
  
  import android.app.Activity;
  import android.content.Context;
  import android.content.Intent;
  import android.content.SharedPreferences;
  import android.content.res.Configuration;
  import android.content.res.Resources;
  import android.os.Bundle;
  import android.preference.PreferenceManager;
  import android.support.v4.app.NavUtils;
  import android.text.Editable;
  import android.text.TextWatcher;
  import android.util.DisplayMetrics;
  import android.view.Menu;
  import android.view.MenuItem;
  import android.view.MotionEvent;
  import android.view.View;
  import android.view.View.OnTouchListener;
  import android.view.ViewGroup;
  import android.widget.AdapterView;
  import android.widget.ArrayAdapter;
  import android.widget.Button;
  import android.widget.EditText;
  import android.widget.Filter;
  import android.widget.Filter.FilterResults;
  import android.widget.Filterable;
  import android.widget.ListView;
  import android.widget.TextView;
  import android.widget.Toast;
  
  public class PlacesMain extends Activity {
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
          PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
          SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
          String localePref = sharedPref.getString("pref_locale", "");
          Configuration conf = getResources().getConfiguration();
          conf.locale = new Locale(localePref);
          DisplayMetrics metrics = new DisplayMetrics();
          getWindowManager().getDefaultDisplay().getMetrics(metrics);
          Resources resources = new Resources(getAssets(), metrics, conf);
  
          setContentView(R.layout.activity_places_main);
  
          final ListView listview = (ListView) findViewById(R.id.listView1);
  
          final EditText edittext = (EditText) findViewById(R.id.editText1);
  
          String[] galilee = getResources().getStringArray(R.array.galilee_places);
          String[] judea = getResources().getStringArray(R.array.judea_places);
  
          String[] galilee_en = new String[galilee.length];
          String[] judea_en = new String[judea.length];
  
          if(localePref != "en"){
              Locale current = conf.locale;
              conf.locale = new Locale("en");
              metrics = new DisplayMetrics();
              getWindowManager().getDefaultDisplay().getMetrics(metrics);
              Resources resources_en = new Resources(getAssets(), metrics, conf);
              galilee_en = resources_en.getStringArray(R.array.galilee_places);       
              judea_en = resources_en.getStringArray(R.array.judea_places);       
              conf.locale = current;
              getWindowManager().getDefaultDisplay().getMetrics(metrics);
              resources = new Resources(getAssets(), metrics, conf);
          }
          else{
              galilee_en = galilee;       
              judea_en = judea;       
          }
  
          final ArrayList&lt;Item&gt; galileeArrayList = new ArrayList&lt;Item&gt;();
          final ArrayList&lt;Item&gt; judeaArrayList = new ArrayList&lt;Item&gt;();
          final ArrayList&lt;Item&gt; allArrayList = new ArrayList&lt;Item&gt;();
  
          for (int i = 0; i &lt; galilee.length; ++i)
          {
            galileeArrayList.add(new Item(galilee[i],galilee_en[i],i));
            allArrayList.add(new Item(galilee[i],galilee_en[i],i));
          }
          for (int i = 0; i &lt; judea.length; ++i)
          {
            judeaArrayList.add(new Item(judea[i],judea_en[i],i));
            allArrayList.add(new Item(judea[i],judea_en[i],i));
          }
          Collections.sort(galileeArrayList,new Comparator&lt;Item&gt;(){
              public int compare(Item o1, Item o2){
                  return o1.getPlace().compareTo(o2.getPlace());
              }
          });
          Collections.sort(judeaArrayList,new Comparator&lt;Item&gt;(){
              public int compare(Item o1, Item o2){
                  return o1.getPlace().compareTo(o2.getPlace());
              }
          });
          Collections.sort(allArrayList,new Comparator&lt;Item&gt;(){
              public int compare(Item o1, Item o2){
                  return o1.getPlace().compareTo(o2.getPlace());
              }
          });
  
          final ItemAdapter all_adapter = new ItemAdapter(this, android.R.layout.simple_list_item_1,allArrayList);
          final ItemAdapter galilee_adapter = new ItemAdapter(this, android.R.layout.simple_list_item_1,galileeArrayList);
          final ItemAdapter judea_adapter = new ItemAdapter(this, android.R.layout.simple_list_item_1,judeaArrayList);
  
          listview.setTextFilterEnabled(true);
          listview.setAdapter(all_adapter);
  
          edittext.addTextChangedListener(new TextWatcher(){
                 @Override
                  public void onTextChanged(CharSequence s, int start, int before, int count) {
  
                     // TODO Auto-generated method stub
                     String mytext = edittext.getText().toString();
                     all_adapter.getFilter().filter(s);
                  }
  
                  @Override
                  public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  
                      // TODO Auto-generated method stub
                  }
  
                  @Override
                  public void afterTextChanged(Editable s) {
  
                      // TODO Auto-generated method stub
                  }           
          });
      }
  
  
  
      private class ItemAdapter extends ArrayAdapter&lt;Item&gt; implements Filterable {
          private final Object mLock = new Object();
          private ItemsFilter mFilter;
          private ArrayList&lt;Item&gt; mItems;
  
          public ItemAdapter(Context context, int textViewResourceId, ArrayList&lt;Item&gt; mItems) {
              super(context, textViewResourceId, mItems);
              this.mItems = mItems;
          }
  
          @Override
          public View getView (int position, View convertView, ViewGroup parent) {
              View view = super.getView(position, convertView, parent);
              Item i = mItems.get(position);
              if(i != null){
                  TextView text1 = (TextView) view.findViewById(android.R.id.text1);
                  text1.setText(i.getPlace());
                  view.setTag(i.getPlaceEn());
              }
              return view;
          }
  
          public Filter getFilter(){
              if (mFilter == null){
                  mFilter = new ItemsFilter();
              }
              return mFilter;
          }
  
          private class ItemsFilter extends Filter {
              protected FilterResults performFiltering(CharSequence prefix) {
                  //Initiate our results object
                  FilterResults results = new FilterResults();
                  // If the adapter array is empty, check the actual items array and use it
                  if (mItems == null) {
                      synchronized (mLock) { // Notice the declaration above
                          mItems = new ArrayList&lt;Item&gt;();
                      }
                  }
                  // If no prefix is sent to the filter we'll send back the original array
                  if(prefix == null || prefix.length() == 0){
                      synchronized (mLock) {
                          results.values = mItems;
                          results.count = mItems.size();
                      }
                  }
                  else{
                      // compare lower case strings
                      String prefixString = prefix.toString().toLowerCase();
                      ArrayList&lt;Item&gt; items = mItems;
                      final int count = items.size();
                      final ArrayList&lt;Item&gt; newItems = new ArrayList&lt;Item&gt;(count);
                      for (int i = 0; i &lt; count; i++){
                          final Item item = items.get(i);
                          final String itemPlace = item.getPlace().toLowerCase();
                          // First match against the whole, non splitted value
                          if (itemPlace.startsWith(prefixString)){
                              // TODO this index won't be correct, need separate index from loop increment
                              newItems.add(new Item(item.getPlace(),item.getPlaceEn(),i));
                          }
                          else{
  
                          }
                      }
                      // Set and return
                      results.values = newItems;
                      results.count = newItems.size();
                  }
                  return results;
              }
  
              @SuppressWarnings("unchecked")
              protected void publishResults(CharSequence prefix, FilterResults results){
                  //noinspection unchecked
                  mItems = (ArrayList&lt;Item&gt;) results.values;
                  // Let the adapter know about the updated list
                  if(results.count &gt; 0){
                      notifyDataSetChanged();
                  }
                  else{
                      notifyDataSetInvalidated();
                  }
              }
          }
      }
  
  }
  </code></pre>
  
  <p>This is the main part of the code, I cut out other parts (buttons and their touch listeners) that are less interesting to this problem.
  I have no errors except on the import for android.widget.Filter.FilterResults;
  I have tried taking "final" off of the adapters, but that gives me errors saying that they have to be final. I have tried taking "final" off of the ArrayLists, but that didn't change anything, still have the error in the import "the type android.widget.Filter.FilterResults is not visible".
  What else can be wrong with this?</p>
  
  <p>I'm using my own custom Item class:</p>
  
  <pre><code>public class Item {
      private String place;
      private String placeEn;
      private int id;
  
      public Item(String place, String placeEn, int id) {
          this.place = place;
          this.placeEn = placeEn;
          this.id = id;
      }
      public String getPlace() {
          return place;
      }
      public String getPlaceEn() {
          return placeEn;
      }
      public int getId(){
          return id;
      }
      public void setPlace(String place){
          this.place = place;
      }
      public void setPlaceEn(String placeEn){
          this.placeEn = placeEn;
      }
      public void setId(int id){
          this.id = id;
      }
  }
  </code></pre>
  
  <p>And I can't ask on the other post what the solution was cause I don't have enough "reputation" on here to make comments yet, ugh.</p>