Android - SearchView en ActionBar [Se a detenido la aplicación]

 
Vista:
sin imagen de perfil

SearchView en ActionBar [Se a detenido la aplicación]

Publicado por Ivan Joel (1 intervención) el 25/07/2017 23:20:45
Vengo desarrollando una app con una lista que es llenada por una WEBSERVICE todo bien, hasta que le implemento el SearchView en ActionBar, Intente implementarlo como dice en este tuotial:

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

Todo bien en la implementacion pero a la hora de ejecutarlo me sale el siguiente error en el android monitor:

1
2
3
4
5
07-25 17:21:24.154 19541-19541/com.herprogramacion.iwish E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
07-25 17:21:24.155 19541-19541/com.herprogramacion.iwish E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
                                                                                 at com.herprogramacion.iwish.ui.fragmentos.MainFragment.filter(MainFragment.java:165)
                                                                                 at com.herprogramacion.iwish.ui.fragmentos.MainFragment.onQueryTextChange(MainFragment.java:151)
                                                                                 at android.support.v7.widget.SearchView.onTextChanged(SearchView.java:1143)

las lineas que me marcan error son las siguientes :

1
2
3
4
5
6
7
8
9
10
11
//linea 164 y su complemento
    for (Plaza model : models) {
        final String text = model.getCodigoPlaza().toLowerCase();
        if (text.contains(query)) {
            filPlazaList.add(model);
        }
    }
 
//linea 150 y su complemento
final List<Plaza> filteredModelList = filter(plazas, newText);
        adapter.setFilter(filteredModelList);

Dejo el codigo completo quizas sea me este equivocando en algun lado:

Codigo de mi MainActivity :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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();
            }
        }
    }
}

Codigo de mi MainFragment :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
@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.setQueryHint(getText(R.string.search));
        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> filteredModelList = new ArrayList<>();
        for (Plaza model : models) {
            final String text = model.getCodigoPlaza().toLowerCase();
            if (text.contains(query)) {
                filteredModelList.add(model);
            }
        }
    return filteredModelList;
 
    }
 
 
 
 
 
    /**
     * 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());
        }
 
    }
 
}

Codigo de mi MetaAdapter :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
public class 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> plazas){
        items = new ArrayList<>();
        items.addAll(plazas);
        notifyDataSetChanged();
    }
}
 
 
interface ItemClickListener {
    void onItemClick(View view, int position);
}


wSNuE
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

SearchView en ActionBar [Se a detenido la aplicación]

Publicado por Eduardo (3 intervenciones) el 26/07/2017 13:20:30
Parece que el problema esta en el iterador, mira a ver si tienes bien inicializado la variable models. No me he podido mirar el código entero, lo siento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar