Android : Failure expanding more than one listItems

on Thursday, April 16, 2015


I actually have two ExpandableListView elements like this:


enter image description here


But I want to add more ExpandableListView elements in the near feature.


The problem is, that when I click on the second element a IndexOutOfBoundsException appears (the first one works great):


Here is the logcat:



java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at de.gestureanywhere.MyExpandableAdapter.getChildrenCount(MyExpandableAdapter.java:142)
at android.widget.ExpandableListConnector.refreshExpGroupMetadataList(ExpandableListConnector.java:563)
at android.widget.ExpandableListConnector.expandGroup(ExpandableListConnector.java:688)
at android.widget.ExpandableListView.handleItemClick(ExpandableListView.java:691)
at android.widget.ExpandableListView.performItemClick(ExpandableListView.java:651)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3057)
at android.widget.AbsListView$4.run(AbsListView.java:3799)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5034)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
at dalvik.system.NativeStart.main(Native Method)


These are the corresponding parts of my code:



private ArrayList< String > elternelemente = new ArrayList< String > ();
private ArrayList< Object > kindElemente = new ArrayList< Object > ();


...



ExpandableListView liste_schritt1 = (ExpandableListView) findViewById ( android.R.id.list );

// Zeilenabstand bestimmen
liste_schritt1.setDividerHeight ( 10 );

// Pfeil an der Seite rechts anzeigen lassen durch setGroupIndicator
// liste_schritt1.setGroupIndicator ( getResources().getDrawable(R.drawable.expandiconempty) );
liste_schritt1.setClickable ( true );

elternElementTexte ();
kindElementTexte ();

MyExpandableAdapter adapter = new MyExpandableAdapter (elternelemente, kindElemente );


adapter.setInflater ( ( LayoutInflater ) getSystemService ( Context.LAYOUT_INFLATER_SERVICE ), this );
liste_schritt1.setAdapter ( adapter );

liste_schritt1.setOnChildClickListener ( liste_schritt1_Listener );


...



private void elternElementTexte () {

elternelemente.add("Anwendung starten");
elternelemente.add("Anwendung beenden");


}


private void kindElementTexte () {

// TODO: Bildericons sollen angezeigt werden

ActivityManager manager = ( ActivityManager ) this.getSystemService ( ACTIVITY_SERVICE );


ArrayList< String > kinder = new ArrayList< String > ();


final PackageManager pm = getPackageManager ();
List< ApplicationInfo > packages = pm.getInstalledApplications ( PackageManager.GET_META_DATA );

View inflate = getLayoutInflater(). inflate(R. layout. anwendung_starten_layout, null);

CharSequence charsequence = null;

for ( ApplicationInfo packageInfo : packages ) {

charsequence = pm.getApplicationLabel(packageInfo);

kinder.add ( charsequence.toString() );
}


kindElemente.add ( kinder );

}


And this is my MyExpandableAdapter class:



public class MyExpandableAdapter extends BaseExpandableListAdapter {


static Activity activity;
private ArrayList< Object > childtems;
private LayoutInflater inflater;
private ArrayList< String > elternElementeGlobal;

// enthält alle installierten Programme: [Package Access Helper, Kontakte, Telefon, Rechner,...]
private ArrayList< String > kindElementeGlobal;

// wird von GestureAnyWhere aufgerufen
public MyExpandableAdapter ( ArrayList< String > elternelemente, ArrayList< Object > kindelemente ) {

this.elternElementeGlobal = elternelemente;
this.childtems = kindelemente;
}

public void setInflater ( LayoutInflater inflater, Activity activity ) {
this.inflater = inflater;
this.activity = activity;
}

@Override
// wird aufgerufen, wenn auf ein Elternelement geklickt wurde bzw. immer dann wenn die Liste gescrollt wird
public View getChildView ( int groupPosition, final int kindposition, boolean isLastChild, View layout_mit_Liste_View, ViewGroup parent ) {

Log.d("groupPosition1", "groupPosition1 " + groupPosition);
kindElementeGlobal = ( ArrayList< String > ) childtems.get ( groupPosition );

// die groupPosition bestimmt möglicherweise die Position des Elternelementes (z.B. 0 für 1. geklicktes Elternelement)
Log.d("groupPosition", "groupPosition " + groupPosition);

// enthält alle installierten Programme: [Package Access Helper, Kontakte, Telefon, Rechner,...]
Log.d("kindElementeGlobal", "kindElementeGlobal " + kindElementeGlobal);

TextView textView = null;


if ( layout_mit_Liste_View == null ) {
// referenziert auf das Layout, welches die ExpandableListView enthält
layout_mit_Liste_View = inflater.inflate ( R.layout.anwendung_starten_layout, null );
}

// setzt die Texte jeder einzelnen Zeile der ExpandableListView
textView = ( TextView ) layout_mit_Liste_View.findViewById ( R.id.text_zeile_Liste);
textView.setText(kindElementeGlobal.get(kindposition));

// die kindposition bestimmt die Position der Kindelemente
Log.d("kindposition", "kindposition " + kindposition);

final TextView finalTextView = textView;

// wenn auf eine Zeile der ExpandableListView geklickt wurde
layout_mit_Liste_View.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View view) {

// ermittle den Text einer Zeile, um auf der nächsten Activity der Applikationsname als Überschrift anzuzeigen
final String applikationsname = finalTextView.getText().toString();

Toast.makeText(activity, applikationsname, Toast.LENGTH_SHORT).show();

// sobald auf ein Item geklickt wurde
Intent itemClicked = new Intent(activity, ItemClicked.class);

// muss definiert sein, da es nicht innerhalb einer von Activity abgeleiteten Klasse aufgerufen wird
itemClicked.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);

// Teile dem Intent den Applikationsnamen mit, um auf der nächsten Activity der Applikationsname als Überschrift anzuzeigen
itemClicked.putExtra("applikationsname", applikationsname);

// muss so definiert sein, da nicht innerhalb einer Activity aufgerufen
activity.getApplication().startActivity(itemClicked);
}
});

return layout_mit_Liste_View;
}

@Override
// erhält den Namen der Elternelemente (z.B. groupPosition 0: Anwendung starten)
public View getGroupView ( int groupPosition, boolean ausgeklappt, View convertView, ViewGroup parent ) {

if ( convertView == null ) {
convertView = inflater.inflate ( R.layout.row, null );
}

String text = elternElementeGlobal.get(groupPosition);
Log.d("text", "text " + text);

( ( CheckedTextView ) convertView ).setText(text);
( ( CheckedTextView ) convertView ).setChecked(ausgeklappt);

return convertView;
}

@Override
public Object getChild ( int groupPosition, int childPosition )
{
Log.d("in getChild", "in getChild " + groupPosition + "|" + childPosition);
return null;
}

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

Log.d("in getChildID", "in getChildID " + groupPosition + "|" + childPosition);
return 0;
}

@Override
// wird aufgerufen, wenn ein Elternteil ausgeklappt wird
public int getChildrenCount ( int groupPosition ) {
// int size = ( ( ArrayList< String > ) childtems.get ( groupPosition ) ).size ();

//Log.d("size", "size " + size); // 105
Log.d("in getChildrenCount", "getChildrenCount " + groupPosition);

// return 210;
// die Anzahl muss richtig sein, da es ansonsten zu einem IndexOutOfBoundsException Error
// 105, da 105 installierte Programme (105 Kindelemente)
return ( ( ArrayList< String > ) childtems.get ( groupPosition ) ).size ();
// return 211;
}

@Override
public Object getGroup ( int groupPosition ) {

Log.d("in getGroup", "in getGroup " + groupPosition);
return null;
}


Thanks a lot


0 comments:

Post a Comment