我实际上有两个ExpandableListView
元素:
但我想在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;
}
非常感谢
答案 0 :(得分:1)
每当您更新适配器调用中的项目时:适配器上的notifyDataSetChanged()
。