2016-03-18 9 views
1

Ich arbeite an einer Android-App, die eine Navigationsleiste mit einem ExpandableListView-Menü implementiert, in dieser Ansicht müssen einige Elemente childs haben und andere müssen eine Aktion ausführen, wenn geklickt wird Kinder. Mein Problem hier ist, dass ich einige zufällige crashing habe und ich kann nicht verstehen, was es verursacht. Hier ist der Fehlercode:ExpandableListView stürzt ab, wenn einige Gruppen leer sind

E/Android Runtime: FATAL AUSNAHME: Haupt Prozess: com.toptainer.www, PID: 9722 java.lang.NullPointerException: Versuch zum Aufrufen virtuelle Methode ‚Leere android.widget.TextView .setText (java.lang.CharSequence)‘auf null Objektreferenz bei com.example.nignog.toptainer.ExpandableListAdapter.getChildView (Success.java:377)

App wird meist abstürzen, wenn eine leere Gruppe klicken und dann auf eine Gruppe mit Kindern klicken, obwohl dies die App nicht immer zum Absturz bringt.

Auf jeden Fall ist hier mein Code:

Vor allem hier ist mein Adapter:

class ExpandableListAdapter extends BaseExpandableListAdapter { 

    private Context _context; 
    private List<String> _listDataHeader; 
    private HashMap<String, List<String>> _listDataChild; 

    public ExpandableListAdapter(Context context, List<String> listDataHeader, 
           HashMap<String, List<String>> listChildData) { 
     this._context = context; 
     this._listDataHeader = listDataHeader; 
     this._listDataChild = listChildData; 
    } 

    @Override 
    public Object getChild(int groupPosition, int childPosititon) { 
     return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
       .get(childPosititon); 
    } 

    @Override 
    public long getChildId(int groupPosition, int childPosition) { 
     return childPosition; 
    } 

    @Override 
    public View getChildView(int groupPosition, final int childPosition, 
          boolean isLastChild, View convertView, ViewGroup parent) { 

     if(getChildrenCount(groupPosition)>1){ 

     final String childText = (String) getChild(groupPosition, childPosition); 

     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.menu_item, null); 
     } 

     TextView txtListChild = (TextView) convertView 
       .findViewById(R.id.textoOpcion); 

     txtListChild.setText(childText); 
     } 
     else{ 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.empty_item, null); 
     } 
     return convertView; 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
     if(this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
       != null){ 
      return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
        .size(); 
     } 
     return 1; 

    } 

    @Override 
    public Object getGroup(int groupPosition) { 
     return this._listDataHeader.get(groupPosition); 
    } 

    @Override 
    public int getGroupCount() { 
     return this._listDataHeader.size(); 
    } 

    @Override 
    public long getGroupId(int groupPosition) { 
     return groupPosition; 
    } 

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, 
          View convertView, ViewGroup parent) { 


     String headerTitle = (String) getGroup(groupPosition); 

     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.menu_item, null); 
     } 

     TextView lblListHeader = (TextView) convertView 
       .findViewById(R.id.textoOpcion); 
     lblListHeader.setTypeface(null, Typeface.BOLD); 
     lblListHeader.setText(headerTitle); 
     ImageView icon = (ImageView) convertView.findViewById(R.id.Icono); 

     int[] iconos = {R.drawable.ic_user, R.drawable.ic_camion, R.drawable.ic_box, R.drawable.ic_file, R.drawable.ic_report, android.R.drawable.ic_delete}; 
     icon.setImageResource(iconos[groupPosition]); 

     if(groupPosition == 0) { 
      convertView.setBackgroundColor(Color.BLACK); 
      lblListHeader.setTextColor(Color.WHITE); 
     } 
     else { 
      convertView.setBackgroundColor(Color.WHITE); 
     } 


     return convertView; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return false; 
    } 

    @Override 
    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     if(getChildrenCount(groupPosition)!=1)return true; 
     return false; 
    } 
} 

Aktivität der onCreate Methode:

android.support.v7.app.ActionBar ab = getSupportActionBar(); 
     ab.setHomeAsUpIndicator(R.drawable.hamburger_button); 
     ab.setDisplayHomeAsUpEnabled(true); 

     expandableList= (ExpandableListView) findViewById(R.id.left_drawer); 


     mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout); 
     mActivityTitle = getTitle().toString(); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setHomeButtonEnabled(true); 
     String[] accionesMenu = {getSharedPreferences("Data",Context.MODE_PRIVATE).getString("Usuario", "NOUSER"), "Orden de viaje Emitidas", "Órdenes de viaje en Descarga","Órdenes de viaje en Tránsito","Órdenes de viaje Entregadas","Órdenes de viaje en Carga", "Órdenes de transporte","Guías pendientes", "Reporte", "Desconectar"}; 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     expandableList = (ExpandableListView) findViewById(R.id.left_drawer); 
     prepareListData(); 

     mMenuAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild); 

     // setting list adapter 
     expandableList.setAdapter(mMenuAdapter); 

     expandableList.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { 
      @Override 
      public boolean onGroupClick(ExpandableListView parent, View v, 
             int groupPosition, long id) { 

       boolean booleano = expandableList.isGroupExpanded(groupPosition); 
       for(int i =0; i<5; i++){ 
       if(expandableList.isGroupExpanded(i)) expandableList.collapseGroup(i);} 

       if(!booleano) expandableList.expandGroup(groupPosition); 

       if (groupPosition == 3) startGuiasActivity(); 

       if (groupPosition == 5) { 
        startLoginActivity(); 
       } 
       return true; 
      } 
     }); 

     expandableList.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { 

      @Override 
      public boolean onChildClick(ExpandableListView parent, View v, 
             int groupPosition, int childPosition, long id) { 
       if (groupPosition == 1) { 
        if (childPosition == 0) startOrdenesDeViajeActivity(); 
        if (childPosition == 1) startOrdenesDeViajeDescargaActivity(); 
        if (childPosition == 2) startOrdenesDeViajeTransitoActivity(); 
        if (childPosition == 3) startOrdenesDeViajeEntregadasActivity(); 
        if (childPosition == 4) startOrdenesDeViajeCargaActivity(); 
       } 
       return false; 
      } 
     }); 

Und hier ist meine prepareData Methode:

private void prepareListData() { 
     listDataHeader = new ArrayList<String>(); 
     listDataChild = new HashMap<String, List<String>>(); 

     // Adding data header 
     listDataHeader.add(getSharedPreferences("Data", Context.MODE_PRIVATE).getString("Usuario", "NOUSER")); 
     listDataHeader.add("Órdenes de Viaje"); 
     listDataHeader.add("Órdenes de Transporte"); 
     listDataHeader.add("Guías Pendientes"); 
     listDataHeader.add("Reporte"); 
     listDataHeader.add("Desconectar"); 

     // Adding child data 
     List<String> heading1= new ArrayList<String>(); 
     heading1.add("Emitidas"); 
     heading1.add("En proceso de Descarga"); 
     heading1.add("En tránsito"); 
     heading1.add("Entregadas"); 
     heading1.add("En proceso de Carga"); 


     listDataChild.put(listDataHeader.get(1), heading1); 

    } 

Jede Hilfe wird sehr geschätzt.

+0

Siehe hier: - http://coderzpassion.com/android-expandable-listview-tutorial/ Du könntest Hilfe bekommen, danke –

Antwort

0

In Ihrem getChildView()

TextView txtListChild = (TextView) convertView.findViewById(R.id.textoOpcion); 

txtListChild ist null irgendwie. Deshalb erhalten Sie NullPointerException.

Warum?

Der Grund dafür ist, dass man verschiedene Layouts für unterschiedliche Situationen aufblasen - R.layout.menu_item für Gruppen mit Kindern und R.layout.empty_item Blick für die Gruppe kein Kind mit

aber Sie sind Aufblasen der Ansicht nur dann, wenn

if (convertView == null) 

und in diesem Fall angenommen, die letzte aufgeblähte Ansicht ist R.layout.empty_item und wenn das nächste Element eine Gruppe ohne Kind ist, die if (convertView == null) gibt false zurück und daher wird Ihr R.layout.menu_item nicht aufgepumpt und R.layout.empty_item wird wieder verwendet. Und in diesem Fall haben Sie nicht Ihre textView (die Null wird). Dies wird Ihnen NullPointerException geben.

Lösung

Sie haben 2 Layouts Layout, indem sie ihre Eltern anders zu ändern. Angenommen, das übergeordnete Layout für R.layout.empty_item ist und für R.layout.menu_item ist LinearLayout. ändern getView() -

 if(getChildrenCount(groupPosition)>1){ 
       if(converterView == null || converterView.getClass() == RelativeLayout.class){ 
        converterView = inflater.inflate(R.layout.menu_item, null); 

TextView txtListChild = (TextView) convertView 
       .findViewById(R.id.textoOpcion); 

     txtListChild.setText(childText); 
       } 
      } 
      else{ 
       if(converterView == null || converterView.getClass() == LinearLayout.class){ 
        converterView = inflater.inflate(R.layout.empty_item, null); 
       } 
      } 

return converterView; 

Hope this helfen!

+0

Vielen Dank, deine Erklärung hat mir sehr geholfen, obwohl ich noch einen letzten Zweifel habe : Eine Lösung, die ich ausprobierte und am Ende funktionierte, war das Hinzufügen von convertView = null am Anfang von getView. Es klappt. Aber wird es mir in der Zukunft irgendein Problem geben, wenn ich es so halte? –

+0

Natürlich wird es das gleiche Problem ergeben. Sie müssen Änderungen vornehmen, wie ich es vorgeschlagen habe. –