Filtrar un cursor adapter enlazado a un listview

15 views
Skip to first unread message

Fernando Sigüenza

unread,
Jul 19, 2017, 11:27:29 PM7/19/17
to desarrollad...@googlegroups.com
Amigos como estan, tengo un list view al cual esta enlazado a un CursorAdapter

En una actividad dentro de un fragmento tengo en el toolbar el serchview implementado

Lo que quiero es que cuando digite cualquier letra dentro del serchview se vaya filtrando el listview  y muestre solo las coincidencias de lo que digita el usuario

Mi codigo en el fragment  es el siguiente
public class ArticulosFragment extends Fragment {

private static final String ARG_PRECIO_ID = "precioId";
private OperacionesBaseDatos mOpebase;
private ListView mArticulosList;
private ArticulosCursorAdapter mArticulosAdapter;
private String mPrecioId;

public ArticulosFragment() {
// Required empty public constructor
}


public static ArticulosFragment newInstance(String precioId) {
ArticulosFragment fragment = new ArticulosFragment();
Bundle args = new Bundle();
args.putString(ARG_PRECIO_ID, precioId);
fragment.setArguments(args);
return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//obtenemos el codigo del precio seleccionado para los items
if (getArguments() != null) {
mPrecioId = getArguments().getString(ARG_PRECIO_ID);
if (mPrecioId==null) {
mPrecioId=getResources().getString(R.string.precio_default);
}
}
//habilitamos el toolbar
setHasOptionsMenu(true);
}

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

//referencias UI
mArticulosList = (ListView) root.findViewById(R.id.articulos_list);
mArticulosAdapter = new ArticulosCursorAdapter(getActivity(),null);
mArticulosList.setAdapter(mArticulosAdapter);

// Eventos
mArticulosList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Cursor currentItem = (Cursor) mArticulosAdapter.getItem(i);
String currentItemId = currentItem.getString(currentItem.getColumnIndex(ContratoPedidos.Productos.ID));
String currentItemCod = currentItem.getString(currentItem.getColumnIndex(ContratoPedidos.Productos.CODIGO));
Float currentPrecio = currentItem.getFloat(currentItem.getColumnIndex(ContratoPedidos.Productos.PRECIO));
ShowCantidadItems(currentItemId,currentItemCod,currentPrecio);
}
});

LoadArticulos();
return root;
}



//
//Metodo para revisar el texto del filtro
//

@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) {
//super.onCreateOptionsMenu(menu, inflater);

menu.clear();
inflater.inflate(R.menu.menu_buscar_articulos,menu);
final MenuItem searchItem = menu.findItem(R.id.mnu_articulo_buscar);
final SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setQueryHint("Buscar Articulo");
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
@Override
public boolean onQueryTextSubmit(String query) {

query=query.toUpperCase();
mArticulosAdapter.getFilter().filter(query);
mArticulosAdapter.notifyDataSetChanged();
Toast.makeText(getActivity(),query,Toast.LENGTH_LONG).show();
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (!TextUtils.isEmpty(newText)) {
AplicarFiltro(newText);
//mArticulosList.setFilterText(newText);
//mArticulosAdapter.getFilter().filter(newText);
//mArticulosList.setAdapter(mArticulosAdapter);
}
//searchView.setQuery("", false);
//searchView.setIconified(true);
return false;
}
});

super.onCreateOptionsMenu(menu,inflater);
}

private void AplicarFiltro(String newText) {
ArticulosCursorAdapter adapter = (ArticulosCursorAdapter) mArticulosList.getAdapter();
//adapter.filter(newText);
}
}
Dentro del cursor adapter tengo


public class ArticulosCursorAdapter extends CursorAdapter {

public ArticulosCursorAdapter(Context context, Cursor c) {
super(context, c, 0);
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
return inflater.inflate(R.layout.list_item_articulo,parent,false);
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
//referencias UI
TextView articuloText = (TextView) view.findViewById(R.id.tv_articulo);
TextView cantidadText = (TextView) view.findViewById(R.id.tv_cantidad_articulo);
TextView precioText = (TextView) view.findViewById(R.id.tv_precio_articulo);

//get valores
String codigo=cursor.getString(cursor.getColumnIndex(ContratoPedidos.Productos.CODIGO));
String articulo=cursor.getString(cursor.getColumnIndex(ContratoPedidos.Productos.NOMBRE));
String existencia=cursor.getString(cursor.getColumnIndex(ContratoPedidos.Productos.SALDO));
String precio=cursor.getString(cursor.getColumnIndex(ContratoPedidos.Productos.PRECIO));

//setup
articuloText.setText(articulo);
cantidadText.setText(existencia);
precioText.setText(precio);
}
}



He intentado filtrar en el metodo  onQueryTextChange en este  metodo tengo el texto para aplicar el filtro he probado .getFilter().filter(query); pero  no funciona. no se donde indicarle porque campo del cursor adapter fltrar

En mi caso el Cursor tiene mas de un campo por ejemplo el codigo, nombre, precio de un articulo
Como podria hacer para usar el filtro que digita el usuario

Espero puedan ayudarme

--
Fernando Siguenza
Reply all
Reply to author
Forward
0 new messages