无法扩展多个listItems

时间:2015-04-16 18:52:47

标签: android expandablelistview indexoutofboundsexception

我实际上有两个ExpandableListView元素:

enter image description here

但我想在near功能中添加更多ExpandableListView个元素。

问题是,当我点击第二个元素时出现IndexOutOfBoundsException(第一个效果很好):

这是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)

这些是我的代码的相应部分:

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

}

这是我的MyExpandableAdapter课程:

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

非常感谢

1 个答案:

答案 0 :(得分:1)

每当您更新适配器调用中的项目时:适配器上的notifyDataSetChanged()

相关问题