【问题标题】:Failure expanding more than one listItems扩展多个列表项失败
【发布时间】:2015-04-16 18:52:46
【问题描述】:

我实际上有两个像这样的ExpandableListView 元素:

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

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

这里是日志:

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

非常感谢

【问题讨论】:

    标签: android expandablelistview indexoutofboundsexception


    【解决方案1】:

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

    【讨论】:

    • 好的谢谢你的回答。但是当我启动我的应用程序并单击第二个 listView 时,我总是得到 IndexOutOfBoundsException。第一个 ListView 始终有效。我只为两个列表视图使用了一个适配器。我必须使用第二个适配器还是如何更改代码才能工作?
    • @user3603935 在我看来,这里有很多地方可能会出错。您应该正确覆盖getChild()getGroup(),并在您的getGroupView()getChildView() 中分别调用getChild()getGroup(),而不是直接调用您的ArrayList。问题可能就在这里。如果您愿意,请执行此操作并更新相关代码,以便我们进一步了解。
    • 您的意思是在 getChildView() 中添加 getChild() 并在 getGroupView() 中添加 getGroup() 而不更改其他代码?这个结果是,应用程序不会再崩溃,但第二个列表没有展开
    • 能否请您提供一个可能的解决方案?谢谢
    • @user3603935 您还需要在 getChildView() 和 getGroupView() 中使用 getChild() 和 getGroup()。下面是 getChild() 和 getGroup() 以及计数的正确实现:pastebin.com/SHhjXu11
    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2012-05-20
    • 2013-07-02
    • 2020-07-24
    相关资源
    最近更新 更多