【问题标题】:Filter ArrayList from Database从数据库中过滤 ArrayList
【发布时间】:2019-03-18 03:51:52
【问题描述】:

我想从数据库中过滤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 并且我收到此错误

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

它的另一种回报的可能性?

创建数组之前:

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

【问题讨论】:

  • 您的问题有点不清楚,您要过滤哪个数组?如果您返回 null 而不是视图持有者,为什么它不会抛出异常。
  • 我想过滤适配器,但我认为我需要在创建它之前过滤它,因为null的错误。但我不知道怎么做。

标签: android mysql arrays arraylist filter


【解决方案1】:

永远不应该返回空值来代替视图。在适配器上设置 if 条件,以便它处理每个条件并返回该条件的视图。它不应该返回 null 来代替视图,否则应用程序将崩溃,因为适配器需要某种视图来显示其内容

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

else 部分应该发送一个视图。当它发送 null 时,适配器将崩溃。

所以你应该做的是你应该为每个 if 条件返回一个视图,如果 miId 为 2,你将返回 item_list_asistencia 的视图,而对于其他值,它应该返回一个 不同的视图,但不是 null

1.制作一个名为filteredArr的单独数组;

2.在发送到适配器之前,循环数组metas。在forloop中,如果Meta_Asistencia objeto1.miId为null,则不要将对象放入filteredArr,否则放入filteredArr

如此松散

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

过滤后的数组中没有存储 miId == null 的对象。

3.将过滤后的Arr传递给适配器。

【讨论】:

  • 那么我应该把 if 条件放在 "Meta_Asistencia[] metas = gson.fromJson(mensaje.toString(), MetaAsistencia[].class);" 之后吗?
  • @Ismael 我已经更新了答案。更新代码后请检查并确认给我
  • 因此,我无法在数组中过滤它,因为它会发送导致崩溃的空答案,我需要先过滤它。因为我只想在屏幕上显示我正在过滤的值,例如我只想显示具有 myId 2 的值
  • 是的,所以如果某些 id 具有空值,您可以将它们传递给适配器并返回这些空 id 的视图,或者在将它们传递给适配器之前忽略这些空 id。
  • ok 请检查并与我核实。我正在用代码更新答案
猜你喜欢
  • 1970-01-01
  • 2016-03-25
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
相关资源
最近更新 更多