自己的expandablelistview崩溃的适配器无法将hashmap强制转换为列表

时间:2012-06-05 11:17:14

标签: android expandablelistview classcastexception

我有一个expandiblelistview的onw适配器,它显示父母很好但是当我点击一个组来查看孩子崩溃时:

java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.List

这是我自己的适配器:

    public class adaptadorLista extends SimpleExpandableListAdapter {

     private Context mContext;
      private List<? extends List<? extends Map<String, ?>>> mChildData;
      private List<? extends Map<String, ?>> mParentData;
      private String[] mChildFrom;
      private int[] mChildTo;


      public adaptadorLista(Context contexto,
            List<? extends Map<String, ?>> creaListaDeGrupos,
            int lineaPadre,
            String[] strings,
            int[] is,
            List<? extends List<? extends Map<String, ?>>> creaListadeHijos,
            int lineaHija,
            String[] strings2,
            int[] is2) {

          super(contexto, creaListaDeGrupos, lineaPadre, strings, is, 
                  creaListadeHijos, lineaHija, strings2, is2); 

          mContext = contexto;
          mChildData = creaListadeHijos;
          mChildFrom = strings2;
          mChildTo = is2;             
    }

      @Override   
      public long getChildId(int groupPosition, int childPosition) {
        return 0;
      }
      public View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) { 

      View v; 
      if (convertView == null) { 
              v = newChildView(isLastChild, parent); 
      } else { 
              v = convertView; 
      } 
      bindView(v, mChildData.get(groupPosition).get(childPosition), mChildFrom, mChildTo, groupPosition, childPosition); 
      return v; 
}
      // This method binds my data to the Views specified in the child xml 
                      private void bindView(View view, Map<String, ?> data,String[] from, int[] to, int groupPosition, int childPosition) { 
                              int len = to.length - 1; 
                              // Apply TextViews 
                              for (int i = 0; i < len; i++) { 
                                      TextView v = (TextView) view.findViewById(to[i]); 
                                      if (v != null) { 
                                              v.setText((String) data.get(from[i])); 
                                            } 
                                       }                      
                              } 

      @Override
      public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
      }                      
}

构造函数有两种填充数据的方法:

adaptadorLista expListAdapter = new adaptadorLista(
                        contexto,
                        creaListaDeGrupos(),
                        R.layout.linea_padre,
                        new String[] { "numero_servicio","profesion","direccion","fecha_cad" },
                        new int[] { R.id.tvServicio,R.id.tvProfesion,R.id.tvDireccion,R.id.tvfecha},        
                        creaListadeHijos(), 
                        R.layout.linea_hija,    
                        new String[] { "tipo", "diasEnCurso","estado","fechaProCita" }, 
                        new int[] {R.id.tvTipo , R.id.tvDiasEnCurso, R.id.tvEstado,R.id.tvFechaProximaCita} 
                        );

                setListAdapter( expListAdapter);
registerForContextMenu(getExpandableListView());                    
    }

                private List<? extends List<? extends Map<String, ?>>> creaListadeHijos() {
                    ArrayList resultado_hijo = new ArrayList();
                    for(int i=0;i<ArrayServicios.size();i++){
                        HashMap hijo = new HashMap();
                        hijo.put("tipo", tipos.get(i));
                        hijo.put("diasEnCurso", diasEnCurso.get(i));
                        hijo.put("estado", estados.get(i));
                        hijo.put("fechaProCita", fechasProximasCitas.get(i));


                        resultado_hijo.add(hijo);
                    }

                    return (List)resultado_hijo;    }

                @SuppressWarnings({ "unchecked", "rawtypes" })
                private List<? extends Map<String, ?>> creaListaDeGrupos() {


                    ArrayList resultado_padre = new ArrayList();
                    for(int i=0;i<ArrayServicios.size();i++){
                        HashMap padre = new HashMap();
                        padre.put("numero_servicio", numerosServicios.get(i));
                        padre.put("profesion", profesiones.get(i));
                        padre.put("direccion", direcciones.get(i));
                        padre.put("fecha_cad", fechasCaduca.get(i));

                        resultado_padre.add(padre);
                    }

                    return (List)resultado_padre;
                }

我找到了一个使用这个adapador的例子,但不适合我......

解决方案:

/********Metodo que rellena la lista de hijos*********************/
private List<? extends List<? extends Map<String, ?>>> creaListadeHijos() {
                List<List<Map<String, String>>> resultado_hijo = new ArrayList<List<Map<String, String>>>(); 

                for(int i=0;i<ArrayServicios.size();i++){
                    List<Map<String, String>> hijo = new ArrayList<Map<String,String>>(); 
                    Map<String, String> curChildMap = new HashMap<String, String>(); 
                     curChildMap.put("tipo", tipos.get(i));
                     curChildMap.put("diasEnCurso", diasEnCurso.get(i));
                     curChildMap.put("estado", estados.get(i));
                     curChildMap.put("fechaProCita", fechasProximasCitas.get(i));
                     hijo.add(curChildMap);                     
                 resultado_hijo.add(hijo);
            }

            return resultado_hijo;
            }
/*********************************************************************/

1 个答案:

答案 0 :(得分:1)

ClassCastException似乎采用以下方法:

private List<? extends List<? extends Map<String, ?>>> creaListadeHijos() {
    ArrayList resultado_hijo = new ArrayList();
    for(int i=0;i<ArrayServicios.size();i++){
        HashMap hijo = new HashMap();
        hijo.put("tipo", tipos.get(i));
        hijo.put("diasEnCurso", diasEnCurso.get(i));
        hijo.put("estado", estados.get(i));
        hijo.put("fechaProCita", fechasProximasCitas.get(i));


        resultado_hijo.add(hijo);
    }

    return (List)resultado_hijo;    

}

返回类型应为:

List<? extends List<? extends Map<String, ?>>>

而您的返回变量resultado_hijo的类型为

ArrayList<HashMap<String, ?>? extends List<? extends Map<String, ?>>

缺少外部List