上接系出名门Android(8) - 控件(View)之TextSwitcher, Gallery, ImageSwitcher, Grid...
5、ListView 的 Demo main_list_adapter.xml <? xml version ="1.0" encoding ="utf-8" ?> <!-- 自定义列表适配器的 layout--> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="horizontal" android:layout_width ="fill_parent" android:layout_height ="fill_parent" > < TextView android:id ="@+id/text" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:textSize ="16sp" > </ TextView > </ LinearLayout > MainListAdapter.java packagecom.webabcd.view; importjava.util.List; importandroid.content.Context; importandroid.view.LayoutInflater; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.BaseAdapter; importandroid.widget.TextView; // 继承 BaseAdapter 以实现自定义的列表适配器 public classMainListAdapter extendsBaseAdapter { privateLayoutInflater mInflater; privateList<String> mData; publicMainListAdapter(Context context, List<String> data) { mInflater = LayoutInflater.from(context); mData = data; } @Override public intgetCount() { returnmData.size(); } @Override publicObject getItem( intposition) { returnmData.get(position); } @Override public longgetItemId( intposition) { returnposition; } @Override publicView getView( intposition, View convertView, ViewGroup parent) { TextView text; if(convertView == null) { // 指定一个 layout 作为自定义列表适配器的 layout convertView = mInflater.inflate(R.layout.main_list_adapter, null); text = (TextView) convertView.findViewById(R.id.text); convertView.setTag(text); } else{ text = (TextView) convertView.getTag(); } String mItem = mData.get(position); text.setText(mItem); returnconvertView; } } Main.java packagecom.webabcd.view; importjava.util.ArrayList; importjava.util.List; importandroid.app.ListActivity; importandroid.content.Intent; importandroid.os.Bundle; importandroid.view.View; importandroid.widget.ListView; // 此处要继承 ListActivity ,用以实现 ListView 的功能 public classMain extendsListActivity { privateList<String> mData; /** Called when the activity is first created. */ @Override public voidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(android.R.style.Theme_Light); setContentView(R.layout.main); mData = getData(); // 使用自定义的列表适配器来展现数据 MainListAdapter adapter = newMainListAdapter( this, mData); // 如需使用系统内置的列表适配器,则可以使用类似如下的方法 // ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, mData); this.setListAdapter(adapter); } // ListView 的数据源 privateList<String> getData(){ List<String> items = newArrayList<String>(); items.add( "TextView"); items.add( "Button"); items.add( "ImageButton"); items.add( "ImageView"); items.add( "CheckBox"); items.add( "RadioButton"); items.add( "AnalogClock"); items.add( "DigitalClock"); items.add( "DatePicker"); items.add( "TimePicker"); items.add( "ToggleButton"); items.add( "EditText"); items.add( "ProgressBar"); items.add( "SeekBar"); items.add( "AutoCompleteTextView"); items.add( "MultiAutoCompleteTextView"); items.add( "ZoomControls"); items.add( "Include"); items.add( "VideoView"); items.add( "WebView"); items.add( "RatingBar"); items.add( "Tab"); items.add( "Spinner"); items.add( "Chronometer"); items.add( "ScrollView"); items.add( "TextSwitcher"); items.add( "ListView"); items.add( "Gallery"); items.add( "ImageSwitcher"); items.add( "GridView"); items.add( "ExpandableList"); returnitems; } // ListView 中某项被选中后的逻辑 @Override protected voidonListItemClick(ListView l, View v, intposition, longid) { Intent intent = newIntent(); intent.setClassName( this, "com.webabcd.view._"+ mData.get(position)); startActivityForResult(intent, 0); } } 6、ExpandableList 的 Demo _ExpandableList.java packagecom.webabcd.view; importandroid.app.ExpandableListActivity; importandroid.os.Bundle; importandroid.view.ContextMenu; importandroid.view.Gravity; importandroid.view.MenuItem; importandroid.view.View; importandroid.view.ViewGroup; importandroid.view.ContextMenu.ContextMenuInfo; importandroid.widget.AbsListView; importandroid.widget.BaseExpandableListAdapter; importandroid.widget.ExpandableListAdapter; importandroid.widget.ExpandableListView; importandroid.widget.TextView; importandroid.widget.Toast; importandroid.widget.ExpandableListView.ExpandableListContextMenuInfo; // ExpandableList - 可展开/收缩列表 // 继承 ExpandableListActivity 以实现列表的可展开/收缩的功能 public class_ExpandableList extendsExpandableListActivity { privateExpandableListAdapter mAdapter; @Override protected voidonCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setTitle( "ExpandableList"); mAdapter = newMyExpandableListAdapter(); setListAdapter(mAdapter); registerForContextMenu( this.getExpandableListView()); } // 为列表的每一项创建上下文菜单(即长按后呼出的菜单) @Override public voidonCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.setHeaderTitle( "ContextMenu"); menu.add(0, 0, 0, "ContextMenu"); } // 单击上下文菜单后的逻辑 @Override public booleanonContextItemSelected(MenuItem item) { ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item.getMenuInfo(); String title = ((TextView) info.targetView).getText().toString(); inttype = ExpandableListView.getPackedPositionType(info.packedPosition); if(type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) { intgroupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition); intchildPos = ExpandableListView.getPackedPositionChild(info.packedPosition); Toast.makeText( this, title + " - Group Index: "+ groupPos + " Child Index: "+ childPos, Toast.LENGTH_SHORT).show(); return true; } else if(type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) { intgroupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition); Toast.makeText( this, title + " - Group Index: "+ groupPos, Toast.LENGTH_SHORT).show(); return true; } return false; } public classMyExpandableListAdapter extendsBaseExpandableListAdapter { // 父列表数据 privateString[] groups = { "group1", "group2", "group3", "group4" }; // 子列表数据 privateString[][] children = { { "child1"}, { "child1", "child2"}, { "child1", "child2", "child3"}, { "child1", "child2", "child3", "child4"} }; @Override publicObject getChild( intgroupPosition, intchildPosition) { returnchildren[groupPosition][childPosition]; } @Override public longgetChildId( intgroupPosition, intchildPosition) { returnchildPosition; } @Override public intgetChildrenCount( intgroupPosition) { returnchildren[groupPosition].length; } // 取子列表中的某一项的 View @Override publicView getChildView( intgroupPosition, intchildPosition, booleanisLastChild, View convertView, ViewGroup parent) { TextView textView = getGenericView(); textView.setText(getChild(groupPosition, childPosition).toString()); returntextView; } @Override publicObject getGroup( intgroupPosition) { returngroups[groupPosition]; } @Override public intgetGroupCount() { returngroups.length; } @Override public longgetGroupId( intgroupPosition) { returngroupPosition; } // 取父列表中的某一项的 View @Override publicView getGroupView( intgroupPosition, booleanisExpanded, View convertView, ViewGroup parent) { TextView textView = getGenericView(); textView.setText(getGroup(groupPosition).toString()); returntextView; } @Override public booleanhasStableIds() { return true; } @Override public booleanisChildSelectable( intgroupPosition, intchildPosition) { return true; } // 获取某一项的 View 的逻辑 privateTextView getGenericView() { AbsListView.LayoutParams lp = newAbsListView.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, 48); TextView textView = newTextView(_ExpandableList. this); textView.setLayoutParams(lp); textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); textView.setPadding(32, 0, 0, 0); returntextView; } } } OK [源码下载] 本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/342089 ,如需转载请自行联系原作者