expandable List在扩展后变得混乱

时间:2013-11-28 07:39:53

标签: android expandablelistadapter

在抽屉上实现ExpandableList后,我遇到了一个我无法弄明白的问题。如下:

如图所示,扩展后组项的顺序已经改变,但内容和功能没有!

例如,当我在展开后点击“TEST”时,会指示我进入“设置”窗口!

任何想法?

代码:

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>

1 个答案:

答案 0 :(得分:0)

我明白了! 通过更改这段代码:

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