2013-11-28 29 views
1

在抽屜中實現ExpandableList之後,我遇到了一個我無法弄清楚的問題。這是因爲如下:expandableList在擴展後會被搞亂

如圖所示,該項目組的順序擴大後已改變,雖然內容和功能不!

例如,當我在展開後點擊'測試'時,它會將我引導至'設置'窗口!

有什麼想法嗎?

代碼:

public class MenuListAdapter extends BaseExpandableListAdapter { 

public ArrayList<MenuItems> groupItem, tempChild; 
public ArrayList<Object> Childtem = new ArrayList<Object>(); 
public LayoutInflater minflater; 
public Activity activity; 

private Context context; 
private ArrayList<MenuItems> MenuList; 

String SEPARATOR = "-"; 


public MenuListAdapter(Context context ,ArrayList<MenuItems> grList, ArrayList<Object> childItem) { 
    this.context = context; 
    groupItem = grList; 
    this.Childtem = childItem; 
    } 

public void setInflater(LayoutInflater mInflater, Activity act) { 
    this.minflater = mInflater; 
    activity = act; 
    } 




private class ViewHolder { 
    TextView name; 
    ImageView image; 
} 


@SuppressWarnings("unchecked") 
@Override 
public Object getChild(int groupPosition, int childPosition) { 
    return ((ArrayList<Object>)Childtem.get(childPosition)); 
} 

@Override 
public long getChildId(int groupPosition, int childPosition) { 
     return 0; 
} 

@Override 
public View getChildView(int groupPosition, final int childPosition, 
       boolean isLastChild, View convertView, ViewGroup parent) { 
    tempChild = (ArrayList<MenuItems>) Childtem.get(groupPosition); 
    TextView text = null; 
    ImageView image=null; 

    if (convertView == null) 
    { 
     LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = layoutInflater.inflate(R.layout.expandlist_item,parent,false); 
    } 

    text = (TextView) convertView.findViewById(R.id.childText); 
    image= (ImageView) convertView.findViewById(R.id.childView); 
    text.setText(tempChild.get(childPosition).name); 
    image.setImageResource(tempChild.get(childPosition).image); 
    convertView.setTag(tempChild.get(childPosition)); 
    return convertView; 
} 



@Override 
public int getChildrenCount(int groupPosition) { 
     return ((ArrayList<Object>) Childtem.get(groupPosition)).size(); 
} 

@Override 
public Object getGroup(int groupPosition) { 
    return groupItem.get(groupPosition); 
} 

@Override 
public int getGroupCount() { 
     return groupItem.size(); 
} 

@Override 
public void onGroupCollapsed(int groupPosition) { 
     super.onGroupCollapsed(groupPosition); 

} 

@Override 
public void onGroupExpanded(int groupPosition) { 
     super.onGroupExpanded(groupPosition); 
} 

@Override 
public long getGroupId(int groupPosition) { 
     return groupPosition; 
} 



@Override 
public View getGroupView(int groupPosition, boolean isExpanded, 
       View convertView, ViewGroup parent) { 


    ViewHolder holder = null; 
    int type = getGroupType(groupPosition); 
    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) {   
     holder = new ViewHolder(); 
     if(!groupItem.get(groupPosition).name.equals(SEPARATOR)){ 
     convertView = mInflater.inflate(R.layout.drawer_listview_item, parent,false); 
     holder.name = (TextView) convertView.findViewById(R.id.text1); 
     holder.image = (ImageView) convertView.findViewById(R.id.imageView1); 
     convertView.setTag(holder); 
     holder.name.setText(groupItem.get(groupPosition).name);  
     holder.image.setImageResource(groupItem.get(groupPosition).image); 
     Log.e("Position",groupPosition+""); 
     } 
     else{ 
      convertView = mInflater.inflate(R.layout.seperator, null); 
      convertView.setTag(holder);} 
    } else 
     holder = (ViewHolder) convertView.getTag(); 


    return convertView; 
    } 

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

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

} 





public class MainActivity extends ActionBarActivity { 

private DrawerLayout drawerLayout; 
private ExpandableListView drawerListView; 
private ActionBarDrawerToggle actionBarDrawerToggle; 

private MenuListAdapter menuAdap; 
private ArrayList<MenuItems> menus; 

String SEPARATOR = "-"; 


public class MenuItems { 
    public String name; 
    public int image; 

    public MenuItems(String name,int image){ 
     this.name = name; 
     this.image = image;  
    } 
} 

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

    // get ListView defined in activity_main.xml 
    drawerListView = (ExpandableListView) findViewById(R.id.left_drawer); 


    setGroupData(); 
    menuAdap = new MenuListAdapter(getApplicationContext(), menus ,childItem); 

    setChildGroupData(); 



    drawerListView.setAdapter(menuAdap); 

    // 2. App Icon 
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 

    // 2.1 create ActionBarDrawerToggle 
    actionBarDrawerToggle = new ActionBarDrawerToggle(
      this,     /* host Activity */ 
      drawerLayout,   /* DrawerLayout object */ 
      R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */ 
      R.string.drawer_open, /* "open drawer" description */ 
      R.string.drawer_close /* "close drawer" description */ 
      ); 

    // 2.2 Set actionBarDrawerToggle as the DrawerListener 
    drawerLayout.setDrawerListener(actionBarDrawerToggle); 

    // 2.3 enable and show "up" arrow 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    // just styling option 
    drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 

    drawerListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { 

     @Override 
     public boolean onChildClick(ExpandableListView parent, View v, 
       int groupPosition, int childPosition, long id) { 
      if(groupPosition==1) 
      { 
       if(childPosition==0) 
        setLocale("ar"); 
       else 
        setLocale("en"); 
      } 
      return false; 
     } 
    }); 

    drawerListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { 
     @Override 
     public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) { 
      Fragment fragment = null; 
      switch (i) { 
      case 0: 
       fragment = new About(); 
       drawerLayout.closeDrawer(drawerListView); 
       break;    
      case 1: 
       break; 
      case 2: 
       fragment = new Settings(); 
       break;   
      case 3: 
       //Exit 
       break; 
      } 
      if (fragment != null) { 
       FragmentManager fragmentManager = getSupportFragmentManager(); 
       fragmentManager.beginTransaction() 
         .replace(R.id.content_frame, fragment).commit(); 

       // update selected item and title, then close the drawer 
       drawerListView.setItemChecked(i, true); 
       drawerListView.setSelection(i); 
       setTitle(((MenuItems) menuAdap.getGroup(i)).name); 
       drawerLayout.closeDrawer(drawerListView); 
      } else { 
       // error in creating fragment 
       Log.e("MainActivity", "Error in creating fragment"); 
      } 
      Toast.makeText(
        getApplicationContext(),((MenuItems)menuAdap.getGroup(i)).name, Toast.LENGTH_SHORT) 
        .show(); 


      return false; 
     } 
    }); 


} 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    // Sync the toggle state after onRestoreInstanceState has occurred. 
    actionBarDrawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    actionBarDrawerToggle.onConfigurationChanged(newConfig); 
} 


public void setLocale(String lang) { 
    Locale myLocale = new Locale(lang); 
    Resources res = getResources(); 
    DisplayMetrics dm = res.getDisplayMetrics(); 
    Configuration conf = res.getConfiguration(); 
    conf.locale = myLocale; 
    res.updateConfiguration(conf, dm); 
    Intent refresh = new Intent(this, MainActivity.class); 
    finish(); 
    startActivity(refresh); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    // call ActionBarDrawerToggle.onOptionsItemSelected(), if it returns true 
    // then it has handled the app icon touch event 
    if (actionBarDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    return true; 
} 


public void setGroupData() { 
menus = new ArrayList<MenuItems>(); 

menus.add(new MenuItems(getResources().getString(R.string.menu_about), R.drawable.about)); 
menus.add(new MenuItems(getResources().getString(R.string.menu_changeLanguage), R.drawable.lang)); 
menus.add(new MenuItems(getResources().getString(R.string.menu_settings),R.drawable.settings)); 
menus.add(new MenuItems(getResources().getString(R.string.menu_exit), R.drawable.exit)); 
menus.add(new MenuItems("TEST", R.drawable.circle)); 
menus.add(new MenuItems("TEST2", R.drawable.circle)); 
menus.add(new MenuItems("TEST3", R.drawable.circle)); 
menus.add(new MenuItems("TEST4", R.drawable.circle)); 

//menus.add(new MenuItems(SEPARATOR, 0)); 

} 

ArrayList<Object> childItem = new ArrayList<Object>(); 

public void setChildGroupData() { 
    /** 
    * Add Data For About 
    */ 
    ArrayList<MenuItems> child = new ArrayList<MenuItems>(); 
    childItem.add(child); 

    /** 
    * Add Data For Languages 
    */ 
    child = new ArrayList<MenuItems>(); 
    child.add(new MenuItems(getResources().getString(R.string.Arabic), 
      getResources().getString(R.string.lang).equals("ar")? 
      R.drawable.circle:R.drawable.non)); 
    child.add(new MenuItems(getResources().getString(R.string.English), 
      getResources().getString(R.string.lang).equals("en")? 
      R.drawable.circle:R.drawable.non)); 
    childItem.add(child); 
    /** 
    * Add Data For Settings 
    */ 
    child = new ArrayList<MenuItems>(); 
    childItem.add(child); 

    /** 
    * Add Data For Exit 
    */ 
    child = new ArrayList<MenuItems>(); 
    childItem.add(child); 

    child = new ArrayList<MenuItems>(); 
    childItem.add(child); 

    child = new ArrayList<MenuItems>(); 
    childItem.add(child); 

    child = new ArrayList<MenuItems>(); 
    childItem.add(child); 

    child = new ArrayList<MenuItems>(); 
    childItem.add(child); 


} 


} 

<!-- The main content view --> 

<FrameLayout 
    android:id="@+id/content_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"   
    > 
</FrameLayout> 

<ExpandableListView 
    android:id="@+id/left_drawer" 
    android:layout_width="230dp" 
    android:layout_weight="1" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:background="#333" 
    android:divider="#666" 
    android:choiceMode="singleChoice" 
    android:dividerHeight="1dp" 
    android:groupIndicator="@null"/> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="8dp"/> 

    <TextView 
     android:id="@+id/text1" 
     android:layout_width="match_parent" 
     android:layout_height="30dp" 
     android:layout_gravity="center" 
     android:gravity="center_vertical" 
     android:minHeight="35sp" 
     android:textColor="#ffff" 
     android:textSize="18sp" 
     /> 

</LinearLayout> 



<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"> 
<ImageView 
    android:id="@+id/childView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:gravity="center_vertical" 
    android:paddingLeft="40dp" 
    android:paddingRight="10dp" /> 

<TextView 
    android:id="@+id/childText" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:gravity="center_vertical" 
    android:minHeight="35sp" 
    android:textColor="#ABABAB" 
    android:textSize="16sp" /> 
</LinearLayout> 

回答

0

我想通了! 通過chaning的代碼本peice的:

if (convertView == null) {   
    holder = new ViewHolder(); 
    if(!groupItem.get(groupPosition).name.equals(SEPARATOR)){ 
    convertView = mInflater.inflate(R.layout.drawer_listview_item, parent,false); 
    holder.name = (TextView) convertView.findViewById(R.id.text1); 
    holder.image = (ImageView) convertView.findViewById(R.id.imageView1); 
    convertView.setTag(holder); 
    holder.name.setText(groupItem.get(groupPosition).name);  
    holder.image.setImageResource(groupItem.get(groupPosition).image); 
    Log.e("Position",groupPosition+""); 
    } 
    else{ 
     convertView = mInflater.inflate(R.layout.seperator, null); 
     convertView.setTag(holder);} 
} else 
    holder = (ViewHolder) convertView.getTag(); 

if (convertView == null) {   
    holder = new ViewHolder(); 
    if(!groupItem.get(groupPosition).name.equals(SEPARATOR)){ 
    convertView = mInflater.inflate(R.layout.drawer_listview_item, parent,false); 
    } 
    else{ 
     convertView = mInflater.inflate(R.layout.seperator, null); 
     convertView.setTag(holder);} 

} else{ 
    if(!groupItem.get(groupPosition).name.equals(SEPARATOR)){ 
    holder.name = (TextView) convertView.findViewById(R.id.text1); 
    holder.image = (ImageView) convertView.findViewById(R.id.imageView1); 
    convertView.setTag(holder); 
    holder.name.setText(groupItem.get(groupPosition).name);  
    holder.image.setImageResource(groupItem.get(groupPosition).image); 
    holder = (ViewHolder) convertView.getTag(); 
} 
}