2017-07-26 72 views
1

我一直在開發與由一個WebService沒事填補了列表中的應用程序,直到我實現動作條的搜索查看,嘗試實現它,因爲它在本教程中說:搜索查看在動作條 - 搜索沒有答案

Http://tutorialsbuzz.com/2015/11/android-filter-recyclerview-using-searchview-in-toolbar.html

一切都運行完美的罰款沒有任何錯誤,甚至是放在日誌。

但是它不搜索,我輸入的參數,它不會使搜索我的適配器保持空白:

enter image description here

這是我搜索的一部分:

@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; 
    } 

Complete 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()); 
     } 

    } 

} 

完整代碼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); 
} 

完整代碼廣場:

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

能否請您發表您廣場類 –

+0

是'埃斯托伊EN LA CLASE onQueryTextChange'和'埃斯托伊EN LA CLASE setFilter'越來越印在日誌? –

+0

@NitinMesta好的,這是正確的 –

回答

1

因爲你只有聲明和初始化空ArrayList和不重新初始化

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

在情況1的procesarRespuesta添加這個lin即

this.plazas=Arrays.asList(plazas) 

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