2016-08-03 18 views
0

Dieser Code zum Filtern einer Listview funktioniert, aber wenn ich ein Zeichen in der EditText löschen, nicht die anderen itens der Listview zurück, und wenn ich alle caractereses löschen die ListView löschen.Android - Filter ein listview unvollständig

Hier ist meine Aktivität:

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

    inputSearch.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      itensAdapter.getFilter().filter(s.toString()); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
     } 

    }); 

Hier ist meine Adapter Klasse

public class ListaItensAdapter extends ArrayAdapter<ItemEstoque> implements Filterable { 
private Context context; 
private List<ItemEstoque> itens = null; 
private List<ItemEstoque> itens_exibicao = null; 
Filter f; 

public ListaItensAdapter(Context context, List<ItemEstoque> itens) { 
    super(context, 0, itens); 
    this.itens = itens; 
    this.itens_exibicao = itens; 
    this.context = context; 
} 

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    ItemEstoque item = itens.get(position); 

    if (view == null) 
     view = LayoutInflater.from(context).inflate(R.layout.item_list_estoque, null); 

    TextView textViewNomeProduto = (TextView) view.findViewById(R.id.text_view_nome); 
    textViewNomeProduto.setText(item.getNomeProduto()); 
    TextView textViewPreco = (TextView) view.findViewById(R.id.text_view_preco); 
    textViewPreco.setText(Float.toString(item.getValorUnitarioProduto())); 

    return view; 

} 

@Override 
public Filter getFilter() { 
    if(f == null) { 
     f = new filtrando(); 
    } 

    return f; 
} 

private class filtrando extends Filter 
{ 
    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 

     constraint = constraint.toString().toLowerCase(); 
     FilterResults result = new FilterResults(); 

     if(constraint != null || constraint.toString().length() > 0) 
     { 
      ArrayList<ItemEstoque> filteredItems = new ArrayList<ItemEstoque>(); 

      for(int i = 0, l = itens.size(); i < l; i++) 
      { 
       ItemEstoque m = itens.get(i); 
       if(m.getNomeProduto().toLowerCase().contains(constraint.toString())) { 
        filteredItems.add(m); 
       } 
      } 
      result.count = filteredItems.size(); 
      result.values = filteredItems; 
     } 
     else 
     { 
      synchronized(this) 
      { 
       result.values = itens; 
       result.count = itens.size(); 
      } 
     } 
     return result; 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 

     itens_exibicao = (ArrayList<ItemEstoque>)results.values; 
     notifyDataSetChanged(); 
     clear(); 
     for(int i = 0, l = itens_exibicao.size(); i < l; i++) 
      add(itens_exibicao.get(i)); 
     notifyDataSetChanged(); 
     //notifyDataSetInvalidated(); 

    } 
} 

Ich habe bereits eine Menge von Codes über diese gesehen und ich weiß nicht, was sein könnte ...

Antwort

0

Sie diese mit einfachen Filtermethode erzielen können, wie pro give Code unten ...

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

    inputSearch.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      itensAdapter.getfilter(s.toString()); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
     } 

    }); 

jetzt Ihr Adapter wie folgt aussehen .........

public class ListaItensAdapter extends ArrayAdapter<ItemEstoque> { 
private Context context; 
private List<ItemEstoque> itens = null; 
private List<ItemEstoque> itens_exibicao = null; 
Filter f; 

public ListaItensAdapter(Context context, List<ItemEstoque> itens) { 
    super(context, 0, itens); 
    this.itens = itens; 
    this.itens_exibicao = new ArrayList<ItemEstoque>(); 
     this.itens_exibicao.addAll(itens); 
    this.context = context; 
} 

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    ItemEstoque item = itens.get(position); 

    if (view == null) 
     view = LayoutInflater.from(context).inflate(R.layout.item_list_estoque, null); 

    TextView textViewNomeProduto = (TextView) view.findViewById(R.id.text_view_nome); 
    textViewNomeProduto.setText(item.getNomeProduto()); 
    TextView textViewPreco = (TextView) view.findViewById(R.id.text_view_preco); 
    textViewPreco.setText(Float.toString(item.getValorUnitarioProduto())); 

    return view; 

} 

public void getfilter(String charText) { 
charText = charText.toLowerCase(Locale.getDefault()); 
itens.clear(); 
if (charText.length() == 0) { 
itens.addAll(itens_exibicao); 
} 
else 
{ 
for (ItemEstoque m : itens_exibicao) 
{ 
if (m.getNomeProduto().toLowerCase(Locale.getDefault()).contains(charText)) 
{ 
itens.add(m); 
} 
} 
} 
notifyDataSetChanged(); 
} 


} 
+0

Es hat funktioniert! Vielen Dank! –