最近需要使用到这样一个功能:实现侧滑菜单,且滑动菜单使用到ExpandableListView这样的抽屉控件,虽然大致知道是怎么实现的,但是一具体来操作还是出现诸多问题。也是给了自己不小的打击和警示。SO,纸上得来终觉浅,绝知此事要躬行。此后一定要告诫自己,要适当的进行深度挖掘理解,抓牢每一个知识点。
ExpandableListView组件类似抽屉一样,它的使用就非常简单了。那么先简单看下ExpandableListView将会用到些什么东西:父栏目与子栏目的Item布局、父栏目与子栏目的数据、baseExpandableListViewAdapter的使用,以及实现子栏目监听ChildClickListener。
1.1、父栏目与子栏目的布局:为了简单演示,这里只是想让父栏目与子栏目显示文字
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/parent_TV"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"/>
LinearLayout>
1.2、定义好布局之后,就需要考虑我们父栏目与子栏目需要怎样的数据,为了简单演示,直接定义需要的数据。
private void initData() {
//父栏目中的数据
parent = new ArrayList<String>();
parent.add("one");
parent.add("two");
//为每个父栏目添加子栏目元素
map = new HashMap<String ,List<String>>();
List<String> list_1 = new ArrayList<String>();
list_1.add("one_1");
list_1.add("one_2");
map.put("one", list_1);
List<String> list_2 = new ArrayList<String>();
list_2.add("two_1");
list_2.add("two_2");
map.put("two", list_2);
}
1.3、实现baseExpandableListViewAdapter适配器,尤其是getGroupView与getChildView这两个方法。
class MyAdapter extends BaseExpandableListAdapter{
@Override
public int getGroupCount() {
return parent.size();
}
@Override
public int getChildrenCount(int groupPosition) {
String key = parent.get(groupPosition);
int size = map.get(key).size();
return size;
}
@Override
public Object getGroup(int groupPosition) {
return parent.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
String key = parent.get(groupPosition);
return map.get(key).get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) MainActivity.this
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.parent_layout, null);
}
TextView tv = (TextView) convertView
.findViewById(R.id.parent_TV);
tv.setText(MainActivity.this.parent.get(groupPosition));
return tv;
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
if (convertView == null){
LayoutInflater inflater = MainActivity.this.getLayoutInflater();
convertView = inflater.inflate(R.layout.children_layout, null);
}
TextView tv = (TextView) convertView.findViewById(R.id.children_TV);
String key = MainActivity.this.parent.get(groupPosition);
String info = map.get(key).get(childPosition);
tv.setText(info);
return tv;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
1.4、如果要想为子栏目实现监听
mListView.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
String key = MainActivity.this.parent.get(groupPosition);
if (map.get(key).get(childPosition).equals("one_1")){
}
return false;
}
});
最后,ExpandableListView的使用大致就是这样。接下来需要了解DrawerLayout的使用。
DrawerLayout
惯例,先回顾下DrawerLayout思路:首先是引入布局,然后若有必要需实现监听(DrawerListener(需实现全部方法) or SimpleDrawerListener),他们内容的替换会使用的Fragment,而Fragment强调FragmentManager、Translation、commit。
2.1、DrawerLayout是继承与ViewGroup的,直接当做布局来使用,需要在xml文件中引用此布局,(注意是在android.support.v4.widget.DrawerLayout包下的)如:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/drawer_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff00ff"/>
<ExpandableListView
android:id="@+id/drawer_elv"
android:layout_width="140dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#00ff00"/>
<ListView
android:layout_width="140dp"
android:layout_height="match_parent"
android:layout_gravity="end"
android:background="#00ff00"/>
android.support.v4.widget.DrawerLayout>
2.1、监听
mDrawerLayout.setDrawerListener(new DrawerListener() {
@Override
public void onDrawerStateChanged(int arg0) {
// Toast.makeText(MainActivity_1.this, "Changed", Toast.LENGTH_SHORT).show();
}
@Override
public void onDrawerSlide(View arg0, float arg1) {
// Toast.makeText(MainActivity_1.this, "Slide", Toast.LENGTH_SHORT).show();
}
@Override
public void onDrawerOpened(View arg0) {
// Toast.makeText(MainActivity_1.this, "Opened", Toast.LENGTH_SHORT).show();
}
@Override
public void onDrawerClosed(View arg0) {
// Toast.makeText(MainActivity_1.this, "Closed", Toast.LENGTH_SHORT).show();
}
});
2.3、Fragment
manager.beginTransaction().replace(R.id.drawer_content, f2).commit();
到此,DrawerLayout就是如此简单。结合起来只需要替换ListView而已。通过查询官方的API可知道,官方将DrawerLayout的使用归入Implenenting Effective Navigation。???什么意思呢?实现有效导航?字面意思是这样就暂且理解为实现有效导航吧。接下来将要看看实现有效导航中有哪些未知的东东呢?
1、Creating Swipe Views with Tabs (其实就是ViewPager的使用)。
2、Creating a Navigation Drawer。此节以了解
3、Providing up Navigation。提供向上导航?英语做鸡呀。
4、Providing Proper Back Navigation。提供适当的后退导航?
5、Implementing Descendant Navigation。实现后裔导航?哈哈