在抽屉上实现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>
答案 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();
}
}