2012-12-11 9 views
5

Mam implmented Widok wyszukiwania, który filtruje moje elementy widoku listy. Kiedy wprowadzam dowolny tekst, filtruje on listę, ale kiedy wychodzę z widoku wyszukiwania, nie zwraca z powrotem elementów listy oryginalnej.SearchView filtrowanie ListView

public class PlacesListAdapter extends ArrayAdapter<Place> implements 
     Filterable { 
    public Context context; 
    private List<Place> places, orig, itemDetailsrrayList; 
    private PlaceFilter filter; 

    public PlacesListAdapter(Context context, int textViewResourceId) { 
     super(context, textViewResourceId); 
    } 

    public PlacesListAdapter(Context context, int resource, List<Place> places) { 
     super(context, resource, places); 
     this.context = context; 
     this.places = places; 

     itemDetailsrrayList = places; 
     orig = itemDetailsrrayList; 

     filter = new PlaceFilter(); 
     // imageLoader = new ImageLoader(context.getApplicationContext()); 

    } 

    public int getCount() { 
     return itemDetailsrrayList.size(); 
    } 

    public Place getItem(int position) { 
     return itemDetailsrrayList.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewHolder holder; 
     // View view = convertView; 
     // Place p = places.get(position); 

     if (convertView == null) { 
      LayoutInflater viewInflater; 
      viewInflater = LayoutInflater.from(getContext()); 
      convertView = viewInflater.inflate(R.layout.item_place, null); 

      holder = new ViewHolder(); 
      holder.placeTitle = (TextView) convertView 
        .findViewById(R.id.place_title); 
      holder.placeDistance = (TextView) convertView 
        .findViewById(R.id.place_distance); 
      holder.placeCategoryIcon = (ImageView) convertView 
        .findViewById(R.id.place_category_icon); 

      convertView.setTag(holder); 

     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.placeTitle.setText(itemDetailsrrayList.get(position) 
       .getPlaceTitle()); 
     holder.placeDistance.setText("200"); 
     holder.placeCategoryIcon.setImageResource(R.drawable.icon_category); 

     return convertView; 
    } 

    static class ViewHolder { 
     TextView placeId; 
     TextView placeTitle; 
     TextView placeDistance; 
     ImageView placeCategoryIcon; 
    } 

    @Override 
    public Filter getFilter() { 
     // TODO Auto-generated method stub 
     return filter; 
    } 

    private class PlaceFilter extends Filter { 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults oReturn = new FilterResults(); 
      ArrayList<Place> results = new ArrayList<Place>(); 
      if (orig == null) 
       orig = itemDetailsrrayList; 
      if (constraint != null) { 
       if (orig != null && orig.size() > 0) { 
        for (Place g : orig) { 
         if (g.getPlaceTitle().toLowerCase() 
           .contains(constraint.toString().toLowerCase())) 
          results.add(g); 
        } 
       } 
       oReturn.values = results; 
      } 
      return oReturn; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, 
       FilterResults results) { 
      itemDetailsrrayList = (ArrayList<Place>) results.values; 
      notifyDataSetChanged(); 
     } 

    } 
} 

MainActivity.java

public class MainActivity extends SherlockFragmentActivity implements 
     SearchView.OnQueryTextListener { 
    protected static CharSequence[] _categories = { "Amusement Park", 
      "Bird Sanctuary", "Wild Life", "River", "Hill Station", "Temple", 
      "Rafting", "Fishing", "Hiking", "Museums" }; 

    protected static boolean[] _selections = new boolean[_categories.length]; 

    private final String[] places = new String[] { "Mysore", "Bangalore", 
      "Mangalore", "Wayanad", "Bandipur National Park", "Chickmaglur", 
      "Bandipura", "Coorg", "Kodaikanal", "Hampi", "Ghati Subramanya", 
      "Mekedatu", "Muththathhi", "Shivasamudram", "Talakadu", 
      "Savana Durga" }; 

    public SearchView mSearchView; 
    private TextView mStatusView; 

    private Menu mainMenu = null; 

    PlacesListAdapter adapter; 
    ListView listView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getWindow().requestFeature(Window.FEATURE_ACTION_BAR); 
     setContentView(R.layout.activity_main); 

     Log.i("Nomad", "onCreate"); 

     List<Place> thePlaces = new ArrayList<Place>(); 
     for (int i = 0; i < places.length; i++) { 
      Place pl = new Place("NO_ID", places[i], "NO_DISTANCE", 
        "NO_CATEGORYICON"); 
      thePlaces.add(pl); 
     } 

     listView = (ListView) findViewById(R.id.place_list); 
     adapter = new PlacesListAdapter(MainActivity.this, R.layout.item_place, 
       thePlaces); 

     listView.setAdapter(adapter); 
     listView.setTextFilterEnabled(true); 

     mSearchView = (SearchView) findViewById(R.id.action_search); 

     listView.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> a, View view, int position, 
        long id) { 

       Toast.makeText(MainActivity.this, "Test", Toast.LENGTH_SHORT); 
       startActivity(new Intent(MainActivity.this, PlaceActivity.class)); 
      } 
     }); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     Log.i("Nomad", "onCreateOptionsMenu"); 
     super.onCreateOptionsMenu(menu); 
     MenuInflater inflater = getSupportMenuInflater(); 
     inflater.inflate(R.menu.activity_main, menu); 

     mainMenu = menu; 

     MenuItem searchItem = menu.findItem(R.id.action_search); 

     // Search View 
     mSearchView = (SearchView) searchItem.getActionView(); 
     setupSearchView(searchItem); 

     mSearchView.setOnSearchClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // hide action item 
       if (mainMenu != null) { 
        mainMenu.findItem(R.id.action_category).setVisible(false); 
        mainMenu.findItem(R.id.action_sort).setVisible(false); 
       } 

      } 
     }); 
     mSearchView.setOnCloseListener(new SearchView.OnCloseListener() { 
      @Override 
      public boolean onClose() { 
       // re-show the action button 
       if (mainMenu != null) { 
        mainMenu.findItem(R.id.action_category).setVisible(true); 
        mainMenu.findItem(R.id.action_sort).setVisible(true); 
       } 
       return false; 

      } 
     }); 

     Log.i("Nomad", "after setupSearchView()"); 
     return true; 
    } 

    public boolean onOptionsItemSelected(MenuItem item) { 

     switch (item.getItemId()) { 

     case R.id.action_search: 
      Toast.makeText(this, "Searh", Toast.LENGTH_LONG).show(); 
      Log.i("Nomad", "Click Search"); 
      break; 

     case R.id.action_category: 
      showDialog(); 
      break; 
     case R.id.action_sort_alpha_az: 
      Toast.makeText(this, "Alpha AZ", Toast.LENGTH_LONG).show(); 
      break; 
     case R.id.action_sort_alpha_za: 
      Toast.makeText(this, "Alpha ZA", Toast.LENGTH_LONG).show(); 
      break; 
     case R.id.action_sort_dist_nf: 
      Toast.makeText(this, "Dist NF", Toast.LENGTH_LONG).show(); 
      break; 
     case R.id.action_sort_dist_fn: 
      Toast.makeText(this, "Dist FN", Toast.LENGTH_LONG).show(); 
      break; 
     default: 
      // return super.onOptionsItemSelected(item); 
      break; 
     } 
     return true; 
    } 

    private void setupSearchView(MenuItem searchItem) { 
     mSearchView.setIconifiedByDefault(true); 
     mSearchView.setOnQueryTextListener(this); 
     mSearchView.setSubmitButtonEnabled(false); 

     searchItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS); 
     // | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW 
    } 

    public boolean onQueryTextChange(String newText) { 
     Log.i("Nomad", "onQueryTextChange"); 

     if (TextUtils.isEmpty(newText)) { 
      Log.i("Nomad", "onQueryTextChange Empty String"); 
      listView.clearTextFilter(); 
     } else { 
      Log.i("Nomad", "onQueryTextChange " + newText.toString()); 
      adapter.getFilter().filter(newText.toString()); 
     } 
     return true; 
    } 

    public boolean onQueryTextSubmit(String query) { 
     Log.i("Nomad", "onQueryTextSubmit"); 
     return false; 
    } 

    public boolean onClose() { 
     Log.i("Nomad", "onClose"); 
     return false; 
    } 

    protected boolean isAlwaysExpanded() { 
     return false; 
    } 


} 

Odpowiedz

3

Twoje dwa ArrayList z obiektu adaptera są skierowane do tego samego obiektu z powodu tej linii:

itemDetailsrrayList = places; 
orig = itemDetailsrrayList; 

orig lista powinna być utrzymywana w stanie nienaruszonym, aby w razie potrzeby można było przywrócić oryginalne dane:

orig = new ArrayList<String>(itemDetailsrrayList); 

Jeśli to nie rozwiąże problemu, możesz wyświetlić kod związany z widokiem wyszukiwania.

+0

to nie zadziałało. zaktualizowałem mój kod –

+2

@HarshaMV Nie widzę żadnego kodu do resetowania adaptera podczas zamykania 'SearchView'. Wstaw linię 'adapter.getFilter() .filtr (" ");' w 'SeachView''' onClose() 'metody' OnCloseListener'. – Luksprog

+0

Cholera !! zapomniałem: D bardzo dziękuję: D –