Error in SearchView in ActionBar

3

I have been developing an app with a list that is filled by WEBSERVICE all right, until I implement the SearchView in ActionBar , Try to implement it as it says in this tuotial:

  

link

All good in the implementation but at the time of executing it I get the following error in the android monitor:

the line that marks me error is the following:

final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);

I leave my code maybe I'm doing something wrong, Thanks.

Code of my MainActivity:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Creación del fragmento principal
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new MainFragment(), "MainFragment")
                    .commit();
        }
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == Constantes.CODIGO_DETALLE || requestCode == 3) {
            if (resultCode == RESULT_OK || resultCode == 203) {
                MainFragment fragment = (MainFragment) getSupportFragmentManager().
                        findFragmentByTag("MainFragment");
                fragment.cargarAdaptador();
            }
        }
    }
}

Code of my MainFragment:

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

    private List<Plaza> plazas;



    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);

        final MenuItem item = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
        searchView.setOnQueryTextListener(this);
        //
        MenuItemCompat.setOnActionExpandListener(item,
                new MenuItemCompat.OnActionExpandListener() {
                    @Override
                    public boolean  onMenuItemActionCollapse(MenuItem item){
                        adapter.setFilter(plazas);
                        return true;
                    }
                    @Override
                    public boolean onMenuItemActionExpand(MenuItem item) {
                        // Do something when expanded
                        return true; // Return true to expand action view
                    }
                });
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        final List<Plaza> filteredModelList = filter(plazas, newText);
        adapter.setFilter(filteredModelList);
        return true;
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        return false;
    }

    private List<Plaza> filter(List<Plaza> models, String query) {
        query = query.toLowerCase();
        //
        final List<Plaza> filPlazaList = new ArrayList<>();
        for (Plaza model : models) {
            final String text = model.getCodigoPlaza().toLowerCase();
            if (text.contains(query)) {
                filPlazaList.add(model);
            }
        }
    return filPlazaList;

    }





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

    }

}

Well this is the app before coding SearchView:

    
asked by Ivan More Flores 25.07.2017 в 17:58
source

1 answer

3

Regarding the error message:

  

ClassCastException: android.support.v7.widget.SearchView can not be   cast to android.widget.SearchView

Remember that if you use the support library, you should use this import suitable for the SearchView that is:

import android.support.v7.widget.SearchView

instead of:

import android.widget.SearchView;
    
answered by 25.07.2017 / 18:23
source