PS:終於考完試了,總算是解脫了...可以正式上手項目開發了....
學習內容:
1.掌握如何使用樹形菜單...
對知識點進行一下補充...居然忘記了去學習樹形菜單...不過在這里補上...
ExpandableListView樹形菜單...
樹形菜單其實就是一個列表,只不過是在列表中再次嵌套一個或者是多個子菜單項,子菜單項中可以包括很多的內容...其實就拿QQ來說,就是使用了一個樹形菜單...QQ中的分組管理其實就是樹形菜單的一個應用...樹形菜單繼承與ListView...這里我們使用的是ExpandableListView...一般只要是涉及到了ListView類的列表控件,那么不用多想,肯定會使用到適配器...適配器的目的我想大家都知道,其實就是設置這些列表項以怎樣的方式在畫布上進行顯示...這里我們使用一個BaseExpandableListAdapter適配器...我們只需要在適配器中定義顯示的模式就可以了...
用一個簡單的小例子來實現一下...這里就簡單的使用一個二級的樹形菜單...
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="樹形菜單..." android:textSize="18dp" android:gravity="center"/> <ExpandableListView android:id="@+id/expandablelistview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff"> </ExpandableListView> </LinearLayout>
上面就是一個簡單的布局文件...只有一個ExpandableListView控件在畫布上進行顯示...有的時候我們可以看到非常好看的屬性菜單,那么我們其實可以通過屬性值background屬性來設置,可以把其背景色改成其他的顏色或者是其他的圖片背景...這里實現過程還是比較重要的...使用ExpandableListView需要重寫其內部的方法...必須要進行覆蓋的兩個方法...
getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent);
getChildView(int groupPosition, int chlidPosition, boolean isLastChild, View convertView, ViewGroup parent);
這是兩個必須要繼承的方法...其實看起來並不是很麻煩。這個方法的目的就是,先把這個菜單當成了一個視圖...groupPosition這個參數就是來表明樹形菜單從屬的位置,isExpanded這個參數來判斷某一個樹形菜單是展開的還是封閉的...說白了就是點擊開了,還是給點擊關了,convertView是一個視圖對象,因為這個方法View形的,那么必然需要傳遞View對象才能夠完成該方法的調用...parent參數就是判斷這個樹形菜單的每一個選項是否有自己的父菜單...另一個方法的參數基本類似,其實就是對每一子菜單項的一些操作...
package com.example.expandablelistview; import android.os.Bundle; import android.app.Activity; import android.database.DataSetObserver; import android.graphics.Color; import android.view.Gravity; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.ExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.ExpandableListView.OnChildClickListener; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //設置一個ExpandableListView設置一個適配器...然后在總畫布上進行顯示... final ExpandableListAdapter adapter=new ExpandableListAdapter() { private String[] MainView=new String[]{"一班","二班","三班"};//一級列表所要顯示的內容... //列表組件需要使用到適配器...這個適配器的使用,目的是列表下的子選項以什么樣的格式進行展示... private String[][] SubView=new String[][]{{"aa","bb","cc","dd","ee"},{"aaa","bbb","ccc","ddd","eee"},{"a","b","c","d","e"}};//樹形菜單子列表的內容... TextView getTextView(){ @SuppressWarnings("deprecation") AbsListView.LayoutParams lp=new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,64);//定義了一個布局,設置其長度和寬度... TextView textview=new TextView(MainActivity.this); textview.setLayoutParams(lp);//目的是把自身放在lp這個布局中進行顯示... textview.setGravity(Gravity.CENTER_VERTICAL);//設置居中顯示... textview.setPadding(36, 0, 0, 0);//設置相對位置... textview.setTextSize(16);//設置字體的大小... textview.setTextColor(Color.BLACK);//設置字體的顏色... return textview; } @Override public void unregisterDataSetObserver(DataSetObserver observer) { // TODO Auto-generated method stub } @Override public void registerDataSetObserver(DataSetObserver observer) { // TODO Auto-generated method stub } @Override public void onGroupExpanded(int groupPosition) { // TODO Auto-generated method stub } @Override public void onGroupCollapsed(int groupPosition) { // TODO Auto-generated method stub } @Override public boolean isEmpty() { // TODO Auto-generated method stub return false; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { // TODO Auto-generated method stub return true; } @Override public boolean hasStableIds() { // TODO Auto-generated method stub return true; } //必須需要重寫的方法...獲取組視圖...其實就是主視圖...為主視圖設置一個顯示的方式... @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { // TODO Auto-generated method stub LinearLayout ll=new LinearLayout(MainActivity.this); ll.setOrientation(0); TextView textview=getTextView(); textview.setTextColor(Color.BLACK); textview.setText(getGroup(groupPosition).toString());//設置主視圖的數據信息... ll.addView(textview); return ll; } @Override public long getGroupId(int groupPosition) { // TODO Auto-generated method stub //獲取被觸發列表項的定位... return groupPosition; } @Override public int getGroupCount() { // TODO Auto-generated method stub //返回父菜單項的字符數組長度... return MainView.length; } @Override public Object getGroup(int groupPosition) { // TODO Auto-generated method stub //返回一個字符串對象...這個字符串我們自己可以定義其值... return MainView[groupPosition]; } @Override public long getCombinedGroupId(long groupId) { // TODO Auto-generated method stub return 0; } @Override public long getCombinedChildId(long groupId, long childId) { // TODO Auto-generated method stub return 0; } @Override public int getChildrenCount(int groupPosition) { // TODO Auto-generated method stub //返回子菜單項的數組長度... return SubView[groupPosition].length; } //設置子視圖的布局...顯示的信息,以及如何顯示... @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { // TODO Auto-generated method stub LinearLayout ll=new LinearLayout(MainActivity.this);//設置一個布局... ll.setOrientation(0); TextView textview=new TextView(MainActivity.this); textview.setText(getChild(groupPosition, childPosition).toString());//textView所要顯示的內容... ll.addView(textview);//將這個布局中添加textView控件... return ll; } @Override public long getChildId(int groupPosition, int childPosition) { // TODO Auto-generated method stub return childPosition; } @Override public Object getChild(int groupPosition, int childPosition) { // TODO Auto-generated method stub //這里返回父菜單下的子菜單項的字符數組對象... return SubView[groupPosition][childPosition]; } @Override public boolean areAllItemsEnabled() { // TODO Auto-generated method stub return false; } }; ExpandableListView expandableListView=(ExpandableListView) findViewById(R.id.expandablelistview);//獲取組件... expandableListView.setAdapter(adapter);//綁定適配器... expandableListView.setOnChildClickListener(new OnChildClickListener() { //這里設置了一個監聽,就是當每一個子菜單被點擊的時候,我們也可以觸發一些操作... @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "您剛才點擊了"+adapter.getChild(groupPosition, childPosition), Toast.LENGTH_LONG).show(); return false; } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
這就是一個簡單的實現過程...樹形菜單的應用是非常廣泛的,我們設置是可以在子菜單項被點擊之后再次設置一個布局來顯示更多的數據信息...但是在使用樹形菜單的時候我們需要注意就是一定要讓所有的菜單項目能夠充分的展開顯示在畫布之上....這一點我們需要注意...