首页 > 解决方案 > 从数据库中过滤 ArrayList

问题描述

我想ArrayList从数据库中过滤一个。这是我过滤数组的代码:

if (miId == 2) {
    View v = LayoutInflater.from(viewGroup.getContext())
        .inflate(R.layout.item_list_asistencia, viewGroup, false);

    return new MetaViewHolder(v, this);
} else {
    return null;
}

它运行良好,但问题是当miId != 2它执行时null,我收到此错误

尝试从空对象 >reference 上的字段“android.view.View >android.support.v7.widget.RecyclerView$ViewHolder.itemView”读取

它的另一种回归可能性?

创建数组之前:

public void cargarAdaptador() {

    // Petición GET

    Log.d("DIATX", String.valueOf(11));
    VolleySingleton.
            getInstance(getActivity()).
            addToRequestQueue(
                    new JsonObjectRequest(
                            Request.Method.GET,
                            Constantes.GET_Asistencia,
                            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());
                                }
                            }

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

        Meta_Asistencia[] metas = gson.fromJson(mensaje.toString(), Meta_Asistencia[].class);

        // APLICACIÓN DE ORDEN:
        // Ordenar el array de metas por idMeta de forma descendente:
        Arrays.sort(metas, new Comparator<Meta_Asistencia>() {
            int result;
            DateFormat f = new SimpleDateFormat("yyyy-mm-dd", Locale.ENGLISH);

            @Override
            public int compare(Meta_Asistencia objeto1, Meta_Asistencia objeto2) {
                // Comparamos por fechaLim de forma descendente:
                try {
                    result = f.parse(objeto2.dia).compareTo(f.parse(objeto1.dia));
                    Log.d("DIA", objeto1.dia);
                    Log.d("DIA1", objeto2.dia);
                    Log.d("ordenar", String.valueOf(result));
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                return result;

            }
        });

        // Inicializar adaptador
        adapter = new MetaAdapter_Asistencia(Arrays.asList(metas), getActivity());
        // Setear adaptador a la lista
        lista.setAdapter(adapter);

        progressBar_first.setVisibility(View.INVISIBLE);

我的新过滤器代码:

 // Inicializar adaptador
                Log.d("DIATX", String.valueOf(8));
                for(int i=0;i<metas.size();i++){
                    if(metas.getObject(i).miId != null){
                        filteredArr.put(metas.getObject(i));
                    }
                }
                adapter = new MetaAdapter_Asistencia(Arrays.asList(metas), 
                getActivity(), myId);
                // Setear adaptador a la lista
                    lista.setAdapter(adapter);

                progressBar_first.setVisibility(View.INVISIBLE);

标签: androidmysqlarraysarraylistfilter

解决方案


There should never be a null value returned in place of view. Make your if conditions on the adapter such that it handles every condition and returns a view for that condition. It should never return null in place of view otherwise the app will crash as the adapter needs some kind of view to show its contents.

if (miId == 2) {
    View v = LayoutInflater.from(viewGroup.getContext())
    .inflate(R.layout.item_list_asistencia, viewGroup, false);

    return new MetaViewHolder(v, this);
} else {
    return null;
}

The else part should send a view. When it sends null the adapter will crash.

So what you should do is that you should return a view for every if condition such that if miId is 2, you are returning view of item_list_asistencia and for other values it should return a different view but not null

1.Make a seperate Array named filteredArr;

2.Before sending to adapter, forloop the array metas. In the forloop, if Meta_Asistencia objeto1.miId is null, don't put the object into filteredArr else put into filteredArr

So loosely

for(int i=0;i<metas.size();i++){
    if(metas.getObject(i).miId != null){
        filteredArr.put(metas.getObject(i));
    }
}

No object with miId == null is stored in the filtered array.

3.Pass filteredArr into the adapter.


推荐阅读