2014-03-07 88 views
1

我創建了一個可展開的列表視圖,在單擊子元素時啓動了另一個活動。但是這僅發生在第一個父組中的前三個子元素,當我點擊後續子元素時,該應用崩潰了一個錯誤如何解決Android中的java.lang.IndexOutOfBoundsException?

java.lang.IndexOutOfBounds:無效指數3,大小爲3

我不知道我在哪裏出了問題。

這是MainActivity.java文件

package com.example.expandablelistview; 

    import java.util.ArrayList; 
    import java.util.HashMap; 
    import java.util.List; 
    import android.app.Activity; 
    import android.content.Intent; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.ExpandableListView; 
    import android.widget.ExpandableListView.OnChildClickListener; 


    public class MainActivity extends Activity { 

    ExpandableListAdapter listAdapter; 
    ExpandableListView expListView; 
    List<String> listDataHeader; 
    HashMap<String, List<String>> listDataChild; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // get the listview 
    expListView = (ExpandableListView) findViewById(R.id.lvExp); 

    // preparing list data 
    prepareListData(); 

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

    // setting list adapter 
    expListView.setAdapter(listAdapter); 

    expListView.setOnChildClickListener(new OnChildClickListener() { 

     @Override 
     public boolean onChildClick(ExpandableListView parent, View view, 
       int groupPosition, int childPosition, long id) { 

      // selected item 

      if(listDataHeader.get(groupPosition)=="Catalog"){ 
      Intent i = new Intent(MainActivity.this, SingleListItem.class); 
     // sending data to new activity 
      startActivity(i); 
      } 

      if(listDataHeader.get(groupPosition)=="My Account"){ 

        Intent i1 = new Intent(MainActivity.this,CheckHolds.class); 
        startActivity(i1); 
      } 
      if(listDataHeader.get(groupPosition)=="Library Info"){ 

       Intent i2 = new Intent(MainActivity.this,LibraryHours.class); 
       startActivity(i2); 
      } 

     return false; 
     } 

     }); 
     } 
     /* 
     * Preparing the list data 
     */ 
     private void prepareListData() { 
     listDataHeader = new ArrayList<String>(); 
     listDataHeader.add("Catalog"); 
     listDataHeader.add("My Account"); 
     listDataHeader.add("Library Info"); 

     // Adding child data 
     List<String> catalog = new ArrayList<String>(); 
     catalog.add("Automobile"); 
     catalog.add("Civil"); 
     catalog.add("Electronics and Communication"); 
     catalog.add("Electrical and Electronics"); 
     catalog.add("Information Science"); 
     catalog.add("Industrial Production"); 
     catalog.add("Mechanical"); 
     catalog.add("Basic Sciences"); 

     List<String> myaccount = new ArrayList<String>(); 
     myaccount.add("Check Holds"); 
     myaccount.add("Unreserve Books"); 

     List<String> libraryinfo = new ArrayList<String>(); 
     libraryinfo.add("Library Hours"); 
     libraryinfo.add("Contact Library"); 

     listDataChild.put(listDataHeader.get(0), catalog); // Header, Child data 
     listDataChild.put(listDataHeader.get(1), myaccount); 
     listDataChild.put(listDataHeader.get(2), libraryinfo); 
     } 
     } 

這是ExpandableListAdapter.java文件

package com.example.expandablelistview; 

    import java.util.HashMap; 
    import java.util.List; 

    import android.content.Context; 
    import android.graphics.Typeface; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.BaseExpandableListAdapter; 
    import android.widget.TextView; 

    public class ExpandableListAdapter extends BaseExpandableListAdapter { 

    private Context _context; 
    private List<String> _listDataHeader; // header titles 
    // child data in format of header title, child title 
    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) { 

    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.list_item, null); 
    } 

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

    txtListChild.setText(childText); 
    return convertView; 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
    return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
      .size(); 
    } 

    @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.list_group, null); 
    } 

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

    return convertView; 
    } 

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

    @Override 
    public boolean isChildSelectable(int groupPosition, int childPosition) { 
    return true; 
    } 
    } 

請給我建議,我應該做些什麼改變來解決錯誤。

+2

post logcat .... –

+0

您在哪條線上得到異常? –

+2

一個沒有注意到的bug:'listDataHeader.get(groupPosition)==「我的賬戶」錯誤。使用'equals()'進行字符串值比較。 'listDataHeader.get(groupPosition).equals(「我的賬戶」)'。 – SudoRahul

回答

0

嘗試訪問該組元素如下:

listDataHeader.get(groupPosition).equalsIgnoreCase("My Account") 

還訪問子元素你可以得到它如下:

listDataChild.get(listDataHeader.get(groupPosition)).get(childPosition).equalsIgnoreCase("Automobile"); 

更改您的孩子單擊以下收聽者:

expListView.setOnChildClickListener(new OnChildClickListener() { 

    @Override 
    public boolean onChildClick(ExpandableListView parent, View view, 
      int groupPosition, int childPosition, long id) { 

     // selected item 

     if(listDataHeader.get(groupPosition).equalsIgnoreCase("Catalog")){ 
      Intent i = new Intent(MainActivity.this, SingleListItem.class); 
      // sending data to new activity 
       startActivity(i); 
     } 

     if(listDataHeader.get(groupPosition).equalsIgnoreCase("My Account"){ 

       Intent i1 = new Intent(MainActivity.this,CheckHolds.class); 
       startActivity(i1); 
     } 
     if(listDataHeader.get(groupPosition).equalsIgnoreCase("Library Info"){ 

      Intent i2 = new Intent(MainActivity.this,LibraryHours.class); 
      startActivity(i2); 
     } 

    return false; 
    } 
+0

現在它工作正常:)謝謝。如何將前一個活動的值傳遞給下一個活動?例如。如果我在下一個活動打開時點擊「汽車」,我想在那裏顯示字符串「汽車」。請幫助我做到這一點。 – sheetal

+0

您可以簡單地獲取字符串,正如我在答案中所示。如果你想得到確切的字符串,那麼你可以將它存儲到一個字符串變量中,並將其作爲字符串以'Intent'形式傳遞給另一個活動,並將其從下一個活動中僅從意圖轉換爲下一個活動。就如此容易。 – GrIsHu

1

讓我們考慮這一點,如果條件:

if(listDataHeader.get(groupPosition)=="My Account"){ 

這裏你應該先檢查是否groupPosition是列表listDataHeader的大小,以避免這種Exception內。例如groupPosition < listDataHeader.size()

此處您還在以錯誤的方式進行字符串比較。 Java不支持這種比較。您應該使用它來代替==

要麼.equals("My Account").equalsIgnoreCase("My Account")所以最後這將是:

if(groupPosition < listDataHeader.size() && 
    listDataHeader.get(groupPosition).equalsIgnoreCase("My Account")){ 
相關問題