2016-04-09 14 views
2

Filtrelenebilir (özel) bir liste görünümü oluşturmaya çalışırken bir sorunum var. De filtreleme hata ayıklama aslında işe yarıyor gibi görünüyor, ancak sonuçlar hiç gösterilmez (liste görünümü, herhangi bir şeyi filtrelemek için görünmüyor). Hangi anahtar kelimeyi ararsam ara: tüm öğeler gösterilmeye devam eder. Benim FragmentFiltreleme ArrayAdapter Liste Görünümü yenileniyor (Android)

Kod

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

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

cevap

0

Eh Bir çözüm buldum. Dün birkaç "Stack Overflow" mesajında ​​okudum: "içeri aktardığınız nesnenin ve filtre ettiğiniz nesnenin aynı olduğundan emin olun". Ben adaptörü set onCreatedView (fragmanı) olarak

öyle saniyordum ama ... Sonunda fark çizgiyle benim kod satırı okuduktan sonra ...: Daha sonra

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

, "refreshPokemonListItems" yönteminde bu iki kod satırları yazılır:

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

yourListView.setAdapter(customAdapter); 

Eh ... listview farklı listelerle iki farklı addapters geçirilir. ...

bütün oldu

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

: Ben "onCreateView" kod satırlarını kaldırıp için refreshPokemonList kodu değiştirmek zorunda