Ich habe eine App mit einer Liste entwickelt, die von einem WEBSERVICE alles in Ordnung gefüllt ist, bis ich die Suche in ActionBar implementieren, versuchen Sie es Implementierung, da es in diesem Tutorial sagt:Suche in ActionBar - Suche unbeantwortet
Http://tutorialsbuzz.com/2015/11/android-filter-recyclerview-using-searchview-in-toolbar.html
Alles läuft völlig in Ordnung, ohne Fehler, auch das Protokoll, das gesetzt wird.
aber es nicht suchen, gebe ich die Parameter und es nicht machen die Suche mein Adapter bleibt leer:
Dieser Teil meiner Suche ist:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_form, menu);
MenuItem item = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
searchView.setQueryHint(getText(R.string.search));
searchView.setOnQueryTextListener(this);
//
MenuItemCompat.setOnActionExpandListener(item,
new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when expanded
return true; // Return true to expand action view
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item){
adapter.setFilter(plazas);
return true;
}
});
}
@Override
public boolean onQueryTextChange(String newText) {
try {
ArrayList<Plaza> listaFiltrada =filter(plazas,newText);
adapter.setFilter(listaFiltrada);
}catch (Exception e){
e.printStackTrace();
}
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
private ArrayList<Plaza> filter(ArrayList<Plaza> plazas,String texto){
ArrayList<Plaza> listaFiltrada=new ArrayList<>();
try {
texto=texto.toLowerCase();
for (Plaza plaza: plazas){
String plaza2=plaza.getCodigoPlaza().toLowerCase();
if (plaza2.contains(texto)){
listaFiltrada.add(plaza);
}
}
}catch (Exception e){
e.printStackTrace();
}
return listaFiltrada;
}
Vollständiger Code MainFragment:
/**
* Fragmento principal que contiene la lista de las metas
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class MainFragment extends Fragment implements SearchView.OnQueryTextListener {
/*
Etiqueta de depuracion
*/
private static final String TAG = MainFragment.class.getSimpleName();
/*
Adaptador del recycler view
*/
private MetaAdapter adapter;
/*
Instancia global del recycler view
*/
private RecyclerView lista;
/*
instancia global del administrador
*/
private RecyclerView.LayoutManager lManager;
/*
Instancia global del FAB
*/
private Gson gson = new Gson();
/*
Instancia global para el refresh
*/
SwipeRefreshLayout mSwipeRefreshLayout;
ArrayList<Plaza> plazas = new ArrayList<Plaza>();
// private List<Plaza> items = new ArrayList<Plaza>();
//ArrayList<Plaza> plazas = new ArrayList<Plaza>();
public MainFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Habilitar al fragmento para contribuir en la action bar
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_main, container, false);
lista = (RecyclerView) v.findViewById(R.id.reciclador);
lista.setHasFixedSize(true);
// Usar un administrador para LinearLayout
lManager = new LinearLayoutManager(getActivity());
lista.setLayoutManager(lManager);
mSwipeRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipe_refresh_layout_main);
mSwipeRefreshLayout.setDistanceToTriggerSync(80);// in dips
mSwipeRefreshLayout.setSize(SwipeRefreshLayout.DEFAULT);
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
cargarAdaptador();
mSwipeRefreshLayout.setRefreshing(false);
}
});
// Cargar datos en el adaptador
cargarAdaptador();
return v;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_form, menu);
MenuItem item = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
searchView.setQueryHint(getText(R.string.search));
searchView.setOnQueryTextListener(this);
//
MenuItemCompat.setOnActionExpandListener(item,
new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when expanded
return true; // Return true to expand action view
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item){
adapter.setFilter(plazas);
return true;
}
});
}
@Override
public boolean onQueryTextChange(String newText) {
try {
ArrayList<Plaza> listaFiltrada =filter(plazas,newText);
adapter.setFilter(listaFiltrada);
}catch (Exception e){
e.printStackTrace();
}
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
private ArrayList<Plaza> filter(ArrayList<Plaza> plazas,String texto){
ArrayList<Plaza> listaFiltrada=new ArrayList<>();
try {
texto=texto.toLowerCase();
for (Plaza plaza: plazas){
String plaza2=plaza.getCodigoPlaza().toLowerCase();
if (plaza2.contains(texto)){
listaFiltrada.add(plaza);
}
}
}catch (Exception e){
e.printStackTrace();
}
return listaFiltrada;
}
/**
* Carga el adaptador con las metas obtenidas
* en la respuesta
*/
public void cargarAdaptador() {
// Petición GET
VolleySingleton.
getInstance(getActivity()).
addToRequestQueue(
new JsonObjectRequest(
Request.Method.GET,
Constantes.GET,
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// Procesar la respuesta Json
procesarRespuesta(response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d(TAG, "Error Volley: " + error.toString());
}
}
)
);
}
/**
* Interpreta los resultados de la respuesta y así
* realizar las operaciones correspondientes
*
* @param response Objeto Json con la respuesta
*/
private void procesarRespuesta(JSONObject response) {
try {
// Obtener atributo "estado"
String estado = response.getString("estado");
switch (estado) {
case "1": // EXITO
// Obtener array "metas" Json
JSONArray mensaje = response.getJSONArray("metas");
// Parsear con Gson
Plaza[] plazas = gson.fromJson(mensaje.toString(), Plaza[].class);
// Inicializar adaptador
adapter = new MetaAdapter(Arrays.asList(plazas), getActivity());
// Setear adaptador a la lista
lista.setAdapter(adapter);
break;
case "2": // FALLIDO
String mensaje2 = response.getString("mensaje");
Toast.makeText(
getActivity(),
mensaje2,
Toast.LENGTH_LONG).show();
break;
}
} catch (JSONException e) {
Log.d(TAG, e.getMessage());
}
}
}
komplette Code MetaAdapter:
/**
* Adaptador del recycler view
*/
public class MetaAdapter extends RecyclerView.Adapter<MetaAdapter.MetaViewHolder>
implements ItemClickListener {
/**
* Lista de objetos {@link Meta} que representan la fuente de datos
* de inflado
*/
private List<Plaza> items;
/*
Contexto donde actua el recycler view
*/
private Context context;
public MetaAdapter(List<Plaza> items, Context context) {
this.context = context;
this.items = items;
}
@Override
public int getItemCount() {
return items.size();
}
@Override
public MetaViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_list, viewGroup, false);
return new MetaViewHolder(v, this);
}
@Override
public void onBindViewHolder(MetaViewHolder viewHolder, int i) {
switch(items.get(i).getEstado())
{
case "0":
viewHolder.estado.setText("OCUPADO");
break;
case "1":
viewHolder.estado.setText("VACANTE");
break;
case "2":
viewHolder.estado.setText("RESERVADO");
break;
default:
viewHolder.estado.setText("ERROR");
}
viewHolder.nivel.setText(items.get(i).getNivel());
//viewHolder.estado.setText(items.get(i).getEstado());
viewHolder.colegio.setText(items.get(i).getIe());
viewHolder.especialidad.setText(items.get(i).getEspecialidad());
viewHolder.codigo.setText(items.get(i).getCodigoPlaza());
}
/**
* Sobrescritura del método de la interfaz {@link ItemClickListener}
*
* @param view item actual
* @param position posición del item actual
*/
@Override
public void onItemClick(View view, int position) {
DetailActivity.launch(
(Activity) context, items.get(position).getPlazaID());
}
public static class MetaViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {
// Campos respectivos de un item
public TextView nivel;
public TextView estado;
public TextView colegio;
public TextView especialidad;
public TextView codigo;
public ItemClickListener listener;
public MetaViewHolder(View v, ItemClickListener listener) {
super(v);
nivel = (TextView) v.findViewById(R.id.nivel);
estado = (TextView) v.findViewById(R.id.estado);
colegio = (TextView) v.findViewById(R.id.colegio);
especialidad = (TextView) v.findViewById(R.id.especialidad);
codigo = (TextView) v.findViewById(R.id.codigo);
this.listener = listener;
v.setOnClickListener(this);
}
@Override
public void onClick(View v) {
listener.onItemClick(v, getAdapterPosition());
}
}
public void setFilter(List<Plaza> items){
//items = new ArrayList<>();
//items.addAll(plazas);
//notifyDataSetChanged();
this.items=new ArrayList<>();
this.items.addAll(items);
notifyDataSetChanged();
}
}
interface ItemClickListener {
void onItemClick(View view, int position);
}
komplette Code Plaza:
public class Plaza {
/*
Atributos
*/
private String plazaID;
private String codigoPlaza;
private String ie;
private String modalidad;
private String especialidad;
private String nivel;
private String jornada;
private String tipoVacante;
private String motivoVacante;
private String estado;
private String latitud;
private String longitud;
public Plaza(String plazaID, String codigoPlaza, String ie, String modalidad, String especialidad, String nivel, String jornada, String tipoVacante, String motivoVacante, String estado,String latitud, String longitud) {
this.plazaID = plazaID;
this.codigoPlaza = codigoPlaza;
this.ie = ie;
this.modalidad = modalidad;
this.especialidad = especialidad;
this.nivel = nivel;
this.jornada = jornada;
this.tipoVacante = tipoVacante;
this.motivoVacante = motivoVacante;
this.estado = estado;
this.latitud = motivoVacante;
this.longitud = estado;
}
public String getPlazaID() {
return plazaID;
}
public String getCodigoPlaza() {
return codigoPlaza;
}
public String getIe() {
return ie;
}
public String getModalidad() {
return modalidad;
}
public String getEspecialidad() {
return especialidad;
}
public String getNivel() {
return nivel;
}
public String getJornada() {
return jornada;
}
public String getTipoVacante() {
return tipoVacante;
}
public String getMotivoVacante() {
return motivoVacante;
}
public String getEstado() {
return estado;
}
public String getLatitud() {
return latitud;
}
public String getLongitud() {
return longitud;
}
/**
* Compara los atributos de dos metas
* @param plaza Meta externa
* @return true si son iguales, false si hay cambios
*/
public boolean compararCon(Plaza plaza) {
return this.plazaID.compareTo(plaza.plazaID) == 0 &&
this.codigoPlaza.compareTo(plaza.codigoPlaza) == 0 &&
this.ie.compareTo(plaza.ie) == 0 &&
this.modalidad.compareTo(plaza.modalidad) == 0 &&
this.especialidad.compareTo(plaza.especialidad) == 0 &&
this.nivel.compareTo(plaza.nivel) == 0 &&
this.jornada.compareTo(plaza.jornada) == 0 &&
this.tipoVacante.compareTo(plaza.tipoVacante) == 0 &&
this.motivoVacante.compareTo(plaza.motivoVacante) == 0 &&
this.estado.compareTo(plaza.estado) == 0 &&
this.latitud.compareTo(plaza.latitud) == 0 &&
this.longitud.compareTo(plaza.longitud) == 0;
}
}
Können Sie bitte schreiben Sie Plaza Klasse –
ist 'Estoy en la clase onQueryTextChange' und' Estoy en la clase setFilter' werden in Log gedruckt zu werden? –
@NitinMesta Ok, es ist richtig –