2016-04-09 12 views
2

Ich habe ein Problem versucht, eine filterable (benutzerdefinierte) Listview zu implementieren. Beim Debuggen scheint die Filterung tatsächlich zu funktionieren, aber die Ergebnisse werden nie angezeigt (Listview scheint nichts zu filtern). Welches Keyword ich auch suche: Alle Elemente werden weiterhin angezeigt.Filtering ArrayAdapter Listview nicht erfrischend (Android)

-Code in meinem Fragment

ListView yourListView; 
List<PokemonListItem> pokemonList; 
PokemonListAdapter adapter; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_pokemon_list_overview, 
      container, false); 

    pDialog = new ProgressDialog(getContext()); 
    pDialog.setMessage("Refreshing pokemon list..."); 
    pDialog.setCancelable(false); 
    TAG = PokemonViewer.class.getSimpleName(); 

    yourListView = (ListView) view.findViewById(R.id.urlListView); 
    refreshPokemonListItems(); 

    EditText inputSearch = (EditText) view.findViewById(R.id.searchInput); 

    inputSearch.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
      // When user changed the Text 
      adapter.getFilter().filter(cs); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
             int arg3) {} 

     @Override 
     public void afterTextChanged(Editable arg0) {} 
    }); 

    adapter = new PokemonListAdapter(getContext(), R.id.searchInput, pokemonList); 
    yourListView.setAdapter(adapter); 

    return view; 
} 

Mein DetailListAdapter

public class PokemonListAdapter extends ArrayAdapter<PokemonListItem> implements Filterable{ 
    List<PokemonListItem> pokemonList; 

    public PokemonListAdapter(Context context, int resource, List<PokemonListItem> items) { 
     super(context, resource, items); 
     this.pokemonList = items; 
    } 

    Filter myFilter = new Filter() { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults filterResults = new FilterResults(); 
      ArrayList<PokemonListItem> tempList=new ArrayList<>(); 
      //constraint is the result from text you want to filter against. 
      //objects is your data set you will filter from 
      Log.v("Logger", "The constraint is now: " + constraint.toString()); 
      if(constraint != null && pokemonList!=null) { 
       int length=pokemonList.size(); 
       int i=0; 
       while(i<length){ 
        PokemonListItem item=pokemonList.get(i); 
        //do whatever you wanna do here 
        //adding result set output array 
        boolean containsString = item.getName().toLowerCase().contains(constraint.toString().toLowerCase()); 
        if(containsString){ 
         tempList.add(item); 
         //Log.v("Logger", "Constraint: " + constraint.toString().toLowerCase() + " value: " + item.getName() + " bool: " + containsString); 
        } 

        i++; 
       } 
       //following two lines is very important 
       //as publish result can only take FilterResults objects 
       filterResults.values = tempList; 
       filterResults.count = tempList.size(); 
      } 
      return filterResults; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence contraint, FilterResults results) { 
      pokemonList = (List<PokemonListItem>) results.values; 
      Log.v("Logger", "This is called"); 
      if (results.count > 0) { 
       Log.v("Logger", "true is called"); 
       Log.v("Logger", results.values.toString()); 
       clear(); 
       for (PokemonListItem item : pokemonList) { 
        add(item); 
       } 
       notifyDataSetChanged(); 
      } else { 
       Log.v("Logger", "false is called"); 
       notifyDataSetInvalidated(); 
      } 
     } 
    }; 

    @Override 
    public Filter getFilter() { 
     return myFilter; 
    } 

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

     View v = convertView; 

     if (v == null) { 
      LayoutInflater vi; 
      vi = LayoutInflater.from(getContext()); 
      v = vi.inflate(R.layout.url_list_row, null); 
     } 

     PokemonListItem p = getItem(position); 

     if (p != null) { 
      TextView name = (TextView) v.findViewById(R.id.name); 


      if (name != null) { 
       name.setText(p.getName()); 
      } 
     } 

     return v; 
    } 

} 

PokemonListItem

public class PokemonListItem { 
    private String id; 
    private String name; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     //This only works with pokemon names > 2 chars 
     if(name.length() > 1){ 
      char first = Character.toUpperCase(name.charAt(0)); 
      this.name = first + name.substring(1); 
     }else{ 
      this.name = name; 
     } 
    } 

    @Override 
    public String toString(){ 
     return id; 
    } 

Antwort

0

Well Ich habe eine Lösung gefunden. Gestern habe ich in ein paar "Stack Overflow" Posts gelesen: "stelle sicher, dass das Objekt, das du übergibst, und das Objekt, das du filtrierst, gleich sind".

Ich dachte, ich tat, aber ... nach meinem Code Zeile für Zeile lesen schließlich bemerkte ich ...

Im onCreatedView (Fragment) ich den Adapter gesetzt:

adapter = new PokemonListAdapter(getContext(), R.id.searchInput, pokemonList); 
yourListView.setAdapter(adapter); 

Später in der „refreshPokemonListItems“ -Methode diese beiden Zeilen Code geschrieben werden:

// get data from the table by the ListAdapter 
PokemonListAdapter customAdapter = new PokemonListAdapter(getContext(), R.layout.url_list_row, pokemonList); 

yourListView.setAdapter(customAdapter); 

Nun ja ... die Listenansicht zwei verschiedene addapters mit verschiedenen Listen übergeben wird. Ich hatte die Codezeilen in "onCreateView" und ändern Sie den Code in dem refreshPokemonList zu entfernen:

adapter = new PokemonListAdapter(getContext(), R.id.searchInput, pokemonList); 
yourListView.setAdapter(adapter); 

Das ist alles ...

war
Verwandte Themen