I need to do a search on the data in a listview and make a filter.
I looked for some ways to do this, and what seemed to me simpler was to implement Filterable
in the 'adapter' and instantiate its methods. But even following the whole explanation did not work.
Adapter
public class AdapterBDLocal extends BaseAdapter implements Filterable{
private Context mContext;
private CustomFilter filter;
private List<ProdutosPesquisa> produtosList = new ArrayList<>();
private List<ProdutosPesquisa> filterList = new ArrayList<>();
public AdapterBDLocal(Context mContext, List<ProdutosPesquisa> produtosList) {
this.mContext = mContext;
this.produtosList = produtosList;
}
@Override
public int getCount() {
return produtosList.size();
}
@Override
public Object getItem(int i) {
return produtosList.size();
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
View listItem = view;
if(listItem == null)
listItem = LayoutInflater.from(mContext).inflate(R.layout.item_lista_pesquisa,viewGroup,false);
final ProdutosPesquisa p = produtosList.get(i);
TextView nome = (TextView) listItem.findViewById(R.id.txt_nome_produto2);
nome.setText(p.getNome_completo());
TextView categoria = (TextView) listItem.findViewById(R.id.txt_categoria2);
categoria.setText(p.getCategoria());
TextView unidade = (TextView) listItem.findViewById(R.id.txt_unidade2);
unidade.setText(p.getUnidade());
Button btn_add = (Button)listItem.findViewById(R.id.btn_add);
Button btn_rem = (Button)listItem.findViewById(R.id.btn_rem);
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String m = p.getCodigo_barras();
if(list.size()<=9){
list.add(m);
txt.setText(list.toString());
Toast.makeText(mContext, "Adiconado", Toast.LENGTH_SHORT).show();
if(txt.getText()!= null){
}
} else{
Toast.makeText(mContext, "Sua Lista esta grande demais!", Toast.LENGTH_SHORT).show();
}
}
});
btn_rem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String m = p.getCodigo_barras();
list.remove(m);
txt.setText(list.toString());
Toast.makeText(mContext, "Removido da lista!", Toast.LENGTH_SHORT).show();
}
});
return listItem;
}
@Override
public Filter getFilter() {
// TODO Auto-generated method stub
if(filter == null)
{
filter=new CustomFilter();
}
return filter;
}
//INNER CLASS
class CustomFilter extends Filter
{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
// TODO Auto-generated method stub
FilterResults results=new FilterResults();
if(constraint != null && constraint.length()>0)
{
//CONSTARINT TO UPPER
constraint=constraint.toString().toUpperCase();
ArrayList<ProdutosPesquisa> filters=new ArrayList<ProdutosPesquisa>();
//get specific items
for(int i=0;i<filterList.size();i++)
{
if(filterList.get(i).getNome_completo().toUpperCase().contains(constraint))
{
ProdutosPesquisa p = new ProdutosPesquisa();
p.setNome_completo(filterList.get(i).getNome_completo());
filters.add(p);
}
}
results.count=filters.size();
results.values=filters;
}else
{
results.count=filterList.size();
results.values=filterList;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
// TODO Auto-generated method stub
produtosList = (ArrayList<ProdutosPesquisa>) results.values;
notifyDataSetChanged();
}
}
}
Activity
public class PesquisaTesteActivity extends AppCompatActivity {
public static TextView txt;
List<ProdutosPesquisa> lista_produtos;
ListView lv;
AdapterBDLocal adapter;
public static ArrayList list = new ArrayList();
private SearchView searchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pesquisa_teste);
lv = (ListView)findViewById(R.id.lv2);
searchView = (SearchView) findViewById(R.id.search);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return false;
}
});
lista_produtos = DataBaseClass.getInstance(getApplicationContext()).getAllProdutos();
txt = findViewById(R.id.textView);
adapter = new AdapterBDLocal(PesquisaTesteActivity.this, lista_produtos);
lv.setAdapter(adapter);
}
}