2014-02-16 4 views
3

Этот вопрос уже был задан: the type android.widget.Filter.FilterResults is not visible Но ответа не было, и теперь у меня такая же проблема. В этой дискуссии было то, что говорилось о переменных помечается как окончательный, когда они не должны быть для getFilter ... Ну, вот мой код:Ошибка импорта java «тип android.widget.Filter.FilterResults не отображается»

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<Item> galileeArrayList = new ArrayList<Item>(); 
     final ArrayList<Item> judeaArrayList = new ArrayList<Item>(); 
     final ArrayList<Item> allArrayList = new ArrayList<Item>(); 

     for (int i = 0; i < 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 < 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<Item>(){ 
      public int compare(Item o1, Item o2){ 
       return o1.getPlace().compareTo(o2.getPlace()); 
      } 
     }); 
     Collections.sort(judeaArrayList,new Comparator<Item>(){ 
      public int compare(Item o1, Item o2){ 
       return o1.getPlace().compareTo(o2.getPlace()); 
      } 
     }); 
     Collections.sort(allArrayList,new Comparator<Item>(){ 
      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<Item> implements Filterable { 
     private final Object mLock = new Object(); 
     private ItemsFilter mFilter; 
     private ArrayList<Item> mItems; 

     public ItemAdapter(Context context, int textViewResourceId, ArrayList<Item> 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<Item>(); 
        } 
       } 
       // 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<Item> items = mItems; 
        final int count = items.size(); 
        final ArrayList<Item> newItems = new ArrayList<Item>(count); 
        for (int i = 0; i < 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<Item>) results.values; 
       // Let the adapter know about the updated list 
       if(results.count > 0){ 
        notifyDataSetChanged(); 
       } 
       else{ 
        notifyDataSetInvalidated(); 
       } 
      } 
     } 
    } 

} 

Это основная часть кода, я вырезать другие части (кнопки и их сенсорные слушатели), которые менее интересны для этой проблемы. У меня нет ошибок, кроме импорта для android.widget.Filter.FilterResults; Я попытался взять «окончательный» от адаптеров, но это дает мне ошибки, говорящие, что они должны быть окончательными. Я попытался взять «окончательный» от ArrayLists, но это ничего не изменило, все еще есть ошибка в импорте «тип android.widget.Filter.FilterResults не отображается». Что еще может быть не так с этим?

Я использую мой собственный пользовательский класс Item:

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; 
    } 
} 

И я не могу спросить на другую должность, что решение было, потому что я не достаточно «репутацию» здесь, чтобы комментировать все же, тьфу.

+0

Изменить импорт в 'импорта android.widget.Filterable;' и попробовать – Raghunandan

+0

Возможно, вы не можете импортировать Filter.FilterResults, потому что он отмечен как 'protected' и ваш внешний класс не расширяя класс фильтра. Попробуйте переместить реализацию класса ItemFilter в другой файл, другими словами, реализуйте ItemFilter как внешний класс. Вы можете попробовать этот подход, создав фильтр расширения класса и попытаться добавить этот импорт. – nekavally

+1

На самом деле я получил свой собственный ответ. Я думаю, Eclipse добавил, что дополнительные ненужные «import android.widget.Filter.FilterResults;». Довольно очевидно, что это уже импортировано вместе с «import android.widget.Filter». Когда я понял, что это, вероятно, так, я прокомментировал это, и voilà я смог скомпилировать, и все работало, как ожидалось. – JohnRDOrazio

ответ

2

Возвращаясь к этому, чтобы пометить его как в ответе от моего предыдущего комментария по первоначальному вопросу:

Eclipse, автоматически добавляет, что дополнительное ненужное «импортное android.widget.Filter.FilterResults;» после "import android.widget.Filter". Достаточно иметь «import android.widget.Filter», поэтому просто закомментируйте или удалите второй импорт для Filter.FilterResults. Как только я сделал это, ошибок больше не было, и все работало так, как ожидалось.

+0

Если я прокомментирую или удалю его, Eclipse снова добавит его ... –

+0

, если вы используете ярлык импорта автозаполнения, вероятно, вам придется просто прокомментировать его или удалить его каждый раз, когда вы исправляете импорт. – JohnRDOrazio

+0

Но мне нравится эта функция ... :( –

Смежные вопросы