2017-07-26 3 views
1

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:

enter image description here

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; 

    } 

} 
+0

Können Sie bitte schreiben Sie Plaza Klasse –

+0

ist 'Estoy en la clase onQueryTextChange' und' Estoy en la clase setFilter' werden in Log gedruckt zu werden? –

+0

@NitinMesta Ok, es ist richtig –

Antwort

1

Weil die Sie haben nur erklärt und leere Arraylist initialisiert und nicht in

ArrayList<Plaza> plazas = new ArrayList<Plaza>(); 

reinitializing Dein procesarRespuesta für Fall 1 füge diesen lin hinzu e.

this.plazas=Arrays.asList(plazas) 

nach

Plaza[] plazas = gson.fromJson(mensaje.toString(), Plaza[].class);