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()每一個列表項裏面的子列表項個數。