
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:
las lineas que me marcan error son las siguientes :
Dejo el codigo completo quizas sea me este equivocando en algun lado:
Codigo de mi MainActivity :
Codigo de mi MainFragment :
Codigo de mi MetaAdapter :

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

Valora esta pregunta


0