安卓UI組件之ListView詳解

ListView是很常見的一個UI組件,在許多App中都很常用,其意思就是可滾動的列表,使用ListView必須使用Adapter(適配器),常用的適配器友誼ArrayAdapter,SimpleAdapter,BaseAdapter.

ListView一些特殊的屬性是:

android:divider="@drawable/red" //每個列表項之間的分割線
android:entries="@drawable/books" //列表項顯示的數據


佈局代碼示例:

<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="@drawable/red"
android:entries="@drawable/books">
</LIstView>


第一我們使用SimpleAdapter來寫一個ListView:

public class SimpleAdapter extends Activity{
private String[] names =new String[]{"nick","lebron","kobe","kevin"};
private int[] imgsIds[] =new Int[] {R.drawable.1,R.drawable.2,R.drawable.3,R.drawable.4};
@Override
public void onCreate(Bundle savedInsatnceState)
{
super.onCreate(savedInsatnceState);
setTitle("simpleadapter");
setContentView(R.layout.main);
List<Map><String,Object> list=new ArrayList<Map><String,Object>();//創建動態數組ArrayList
for(int i=0;i<names.length;i++){
Map<String,Object> map=new HashMap=<String,Object>;
map.put("name",names[i]);
map.put("headerImg",imgsIds[i]);
list.add(map);
}
SimpleAdapter adapter=new SimpleAdaper(this,list,R.layout.main,new String[]{"name","headerImg"},new int[]{R.id.name,R.id.headerImg});
ListView list=(ListView)findViewById(R.id.mylist);
list.setAdaper(adapter);
}
}

*註釋*
SimpleAdapter是另一種常見的adapter類型,其有五個參數
1:Activity.this
2:傳入的數據
3:數據傳入的界面
4:數據中Map類型數據的String 類的key
5:穿入界面的組件的Id
**

第二種我們使用ArrayAdapter:代碼不詳解,只是重寫Adapter:

String[] str={"china","america","japan"};
List list=new ArrayList<String>();
for(int i=0;i<str.length;i++){
list.add(str[i]);
}
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.simple_list_item2,list);

*註釋*

第三個屬性指定要顯示每一個ListItem的風格:

ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.simple_list_item1,list);:普通文本框
ArrayAdapter<String> adapter=new ArrayAdapetr<String>(this,R.layout.simple_list_multiple_choice);:多選框
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.simple_list_single_choice);:單選框

**


另外,ListView還有一個拓展組件ExpandableListView,就是可拓展的列表,但是他的適配器必須使用ExpandableAdapter:

public class ExpandableListViewTest extends Activity
{
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		//創建一個BaseExpandableListAdapter對象
		ExpandableListAdapter adapter = new BaseExpandableListAdapter()
		{
			int[] logos = new int[]
			{
				R.drawable.p,
				R.drawable.z,
				R.drawable.t
			};
 			private String[] armTypes = new String[]
				{ "神族兵種", "蟲族兵種", "人族兵種"};
			private String[][] arms = new String[][]
			{
				{ "狂戰士", "龍騎士", "黑暗聖堂", "電兵" },
				{ "小狗", "刺蛇", "飛龍", "自爆飛機" },
				{ "機槍兵", "護士MM" , "幽靈" }
			};
			//獲取指定組位置、指定子列表項處的子列表項數據
			@Override
			public Object getChild(int groupPosition, int childPosition)
			{
				return arms[groupPosition][childPosition];
			}
			@Override
			public long getChildId(int groupPosition, int childPosition)
			{
				return childPosition;
			}
			@Override
			public int getChildrenCount(int groupPosition)
			{
				return arms[groupPosition].length;
			}
			private TextView getTextView()
			{
				AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
						ViewGroup.LayoutParams.FILL_PARENT, 64);
				TextView textView = new TextView(ExpandableListViewTest.this);
				textView.setLayoutParams(lp);
				textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
				textView.setPadding(36, 0, 0, 0);
				textView.setTextSize(20);
				return textView;
			}
			//該方法決定每個子選項的外觀
			@Override
			public View getChildView(int groupPosition, int childPosition,
					boolean isLastChild, View convertView, ViewGroup parent)
			{
				TextView textView = getTextView();			
				textView.setText(getChild(groupPosition, childPosition).toString());
				return textView;
			}
			//獲取指定組位置處的組數據
			@Override
			public Object getGroup(int groupPosition)
			{
				return armTypes[groupPosition];
			}
			@Override
			public int getGroupCount()
			{
				return armTypes.length;
			}
			@Override
			public long getGroupId(int groupPosition)
			{
				return groupPosition;
			}
			//該方法決定每個組選項的外觀
			@Override
			public View getGroupView(int groupPosition, boolean isExpanded,
					View convertView, ViewGroup parent)
			{
				LinearLayout ll = new LinearLayout(ExpandableListViewTest.this);
				ll.setOrientation(0);
				ImageView logo = new ImageView(ExpandableListViewTest.this);
				logo.setImageResource(logos[groupPosition]);
				ll.addView(logo);
				TextView textView = getTextView();
				textView.setText(getGroup(groupPosition).toString());				
				ll.addView(textView);			
				return ll;
			}
			@Override
			public boolean isChildSelectable(int groupPosition, int childPosition)
			{
				return true;
			}
			@Override
			public boolean hasStableIds()
			{
				return true;
			}
		};
		ExpandableListView expandListView = (ExpandableListView)
			findViewById(R.id.list);
		expandListView.setAdapter(adapter);
	}
}
使用ExpandableAdapter,我們重新首先重寫其中的一些方法,每一個getGroupView就是顯示的每一個ListGroupItem(列表項),其中重寫的getGroupCount方法放回的就是有多少列表項,而getChildView()就是顯示每一個子列表項,同理getChildCount()每一個列表項裏面的子列表項個數。


發佈了28 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章