系出名门Android(8) - 控件(View)之TextSwitcher, Gallery, ImageSwitcher, GridView, ListView, ExpandableList
介绍
在 Android 中使用各种控件(View)
TextSwitcher - 文字转换器控件(改变文字时增加一些动画效果)
Gallery - 缩略图浏览器控件
ImageSwitcher - 图片转换器控件(改变图片时增加一些动画效果)
GridView - 网格控件
ListView - 列表控件
ExpandableList - 支持展开/收缩功能的列表控件
1、TextSwitcher 的 Demotextswitcher.xml 代码 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/btnChange" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="改变文字" /> <!-- TextSwitcher - 文字转换器控件(改变文字时增加一些动画效果) --> <TextSwitcher android:id="@+id/textSwitcher" android:layout_width="fill_parent" android:layout_height="wrap_content" /></LinearLayout>_TextSwitcher.java代码 package com.webabcd.view;import java.util.Random;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.Button;import android.widget.TextSwitcher;import android.widget.TextView;import android.widget.ViewSwitcher;public class _TextSwitcher extends Activity implements ViewSwitcher.ViewFactory { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); this.setContentView(R.layout.textswithcer); setTitle("TextSwithcer"); final TextSwitcher switcher = (TextSwitcher) findViewById(R.id.textSwitcher); // 指定转换器的 ViewSwitcher.ViewFactory switcher.setFactory(this); // 设置淡入和淡出的动画效果 Animation in = AnimationUtils.loadAnimation(this, android.R.anim.fade_in); Animation out = AnimationUtils.loadAnimation(this, android.R.anim.fade_out); switcher.setInAnimation(in); switcher.setOutAnimation(out); // 单击一次按钮改变一次文字 Button btnChange = (Button) this.findViewById(R.id.btnChange); btnChange.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { switcher.setText(String.valueOf(new Random().nextInt())); } }); } // 重写 ViewSwitcher.ViewFactory 的 makeView(),返回一个 View @Override public View makeView() { TextView textView = new TextView(this); textView.setTextSize(36); return textView; }}2、Gallery 的 Demogallery.xml代码 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <!-- Gallery - 缩略图浏览器控件 spacing - 缩略图列表中各个缩略图之间的间距 --> <Gallery android:id="@+id/gallery" android:layout_width="fill_parent" android:layout_height="wrap_content" android:spacing="20px" /></LinearLayout>_Gallery.java代码 package com.webabcd.view;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.Gallery;import android.widget.ImageView;import android.widget.Toast;import android.widget.Gallery.LayoutParams;public class _Gallery extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); this.setContentView(R.layout.gallery); setTitle("Gallery"); Gallery gallery = (Gallery) findViewById(R.id.gallery); // 为缩略图浏览器指定一个适配器 gallery.setAdapter(new ImageAdapter(this)); // 响应 在缩略图列表上选中某个缩略图后的 事件 gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View v, int position, long id) { Toast.makeText(_Gallery.this, String.valueOf(position), Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> arg0) { } }); } // 继承 BaseAdapter 用以实现自定义的图片适配器 public class ImageAdapter extends BaseAdapter { private Context mContext; public ImageAdapter(Context context) { mContext = context; } public int getCount() { return mThumbIds.length; } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ImageView image = new ImageView(mContext); image.setImageResource(mThumbIds[position]); image.setAdjustViewBounds(true); image.setLayoutParams(new Gallery.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); return image; } } // 需要显示的图片集合 private Integer[] mThumbIds = { R.drawable.icon01, R.drawable.icon02, R.drawable.icon03, R.drawable.icon04, R.drawable.icon05 };}3、ImageSwitcher 的 Demoimageswitcher.xml代码 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Gallery android:id="@+id/gallery" android:layout_width="fill_parent" android:layout_height="wrap_content" android:spacing="20px" /> <!-- ImageSwitcher - 图片转换器控件(改变图片时增加一些动画效果) --> <ImageSwitcher android:id="@+id/imageSwitcher" android:layout_width="fill_parent" android:layout_height="wrap_content" /></LinearLayout>_ImageSwitcher.java代码 package com.webabcd.view;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.view.animation.AnimationUtils;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.Gallery;import android.widget.ImageSwitcher;import android.widget.ImageView;import android.widget.ViewSwitcher;import android.widget.Gallery.LayoutParams;// 图片转换器的使用基本同文字转换器// 以下是一个用 ImageSwitcher + Gallery 实现的经典的图片浏览器的 Demopublic class _ImageSwitcher extends Activity implements ViewSwitcher.ViewFactory { private ImageSwitcher mSwitcher; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); this.setContentView(R.layout.imageswithcer); setTitle("ImageSwithcer"); mSwitcher = (ImageSwitcher) findViewById(R.id.imageSwitcher); mSwitcher.setFactory(this); mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out)); Gallery gallery = (Gallery) findViewById(R.id.gallery); gallery.setAdapter(new ImageAdapter(this)); gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View v, int position, long id) { mSwitcher.setImageResource(mImageIds[position]); } @Override public void onNothingSelected(AdapterView<?> arg0) { } }); } public class ImageAdapter extends BaseAdapter { private Context mContext; public ImageAdapter(Context context) { mContext = context; } public int getCount() { return mThumbIds.length; } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ImageView image = new ImageView(mContext); image.setImageResource(mThumbIds[position]); image.setAdjustViewBounds(true); image.setLayoutParams(new Gallery.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); return image; } } private Integer[] mThumbIds = { R.drawable.icon01, R.drawable.icon02, R.drawable.icon03, R.drawable.icon04, R.drawable.icon05 }; private Integer[] mImageIds = { R.drawable.icon01, R.drawable.icon02, R.drawable.icon03, R.drawable.icon04, R.drawable.icon05 }; @Override public View makeView() { ImageView image = new ImageView(this); image.setMinimumHeight(200); image.setMinimumWidth(200); image.setScaleType(ImageView.ScaleType.FIT_CENTER); image.setLayoutParams(new ImageSwitcher.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); return image; }}4、GridView 的 Demogridview.xml代码 <?xml version="1.0" encoding="utf-8"?><!-- GridView - 网格控件 numColumns="auto_fit" - 列数自适应 stretchMode - 缩放模式(stretchMode="columnWidth" - 缩放与列宽大小同步)--><GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gridView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10px" android:verticalSpacing="10px" android:horizontalSpacing="10px" android:numColumns="auto_fit" android:columnWidth="60px" android:stretchMode="columnWidth" android:gravity="center"></GridView>_GridView.java代码 package com.webabcd.view;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.GridView;import android.widget.ImageView;public class _GridView extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); this.setContentView(R.layout.gridview); setTitle("GridView"); GridView gridView = (GridView) findViewById(R.id.gridView); // 指定网格控件的适配器为自定义的图片适配器 gridView.setAdapter(new ImageAdapter(this)); } // 自定义的图片适配器 public class ImageAdapter extends BaseAdapter { private Context mContext; public ImageAdapter(Context context) { mContext = context; } public int getCount() { return mThumbIds.length; } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(mContext); imageView.setLayoutParams(new GridView.LayoutParams(48, 48)); imageView.setAdjustViewBounds(false); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setPadding(5, 5, 5, 5); } else { imageView = (ImageView) convertView; } imageView.setImageResource(mThumbIds[position]); return imageView; } // 网格控件所需图片数据的数据源 private Integer[] mThumbIds = { R.drawable.icon01, R.drawable.icon02, R.drawable.icon03, R.drawable.icon04, R.drawable.icon05 }; }}5、ListView 的 Demomain_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代码 package com.webabcd.view;import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;// 继承 BaseAdapter 以实现自定义的列表适配器public class MainListAdapter extends BaseAdapter { private LayoutInflater mInflater; private List<String> mData; public MainListAdapter(Context context, List<String> data) { mInflater = LayoutInflater.from(context); mData = data; } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, 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); return convertView; }}Main.java代码 package com.webabcd.view;import java.util.ArrayList;import java.util.List;import android.app.ListActivity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.ListView;// 此处要继承 ListActivity ,用以实现 ListView 的功能public class Main extends ListActivity { private List<String> mData; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(android.R.style.Theme_Light); setContentView(R.layout.main); mData = getData(); // 使用自定义的列表适配器来展现数据 MainListAdapter adapter = new MainListAdapter(this, mData); // 如需使用系统内置的列表适配器,则可以使用类似如下的方法 // ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, mData); this.setListAdapter(adapter); } // ListView 的数据源 private List<String> getData() { List<String> items = new ArrayList<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"); return items; } // ListView 中某项被选中后的逻辑 @Override protected void onListItemClick(ListView l, View v, int position, long id) { Intent intent = new Intent(); intent.setClassName(this, "com.webabcd.view._" + mData.get(position)); startActivityForResult(intent, 0); }}6、ExpandableList 的 Demo_ExpandableList.java代码 package com.webabcd.view;import android.app.ExpandableListActivity;import android.os.Bundle;import android.view.ContextMenu;import android.view.Gravity;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.view.ContextMenu.ContextMenuInfo;import android.widget.AbsListView;import android.widget.BaseExpandableListAdapter;import android.widget.ExpandableListAdapter;import android.widget.ExpandableListView;import android.widget.TextView;import android.widget.Toast;import android.widget.ExpandableListView.ExpandableListContextMenuInfo;// ExpandableList - 可展开/收缩列表// 继承 ExpandableListActivity 以实现列表的可展开/收缩的功能public class _ExpandableList extends ExpandableListActivity { private ExpandableListAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setTitle("ExpandableList"); mAdapter = new MyExpandableListAdapter(); setListAdapter(mAdapter); registerForContextMenu(this.getExpandableListView()); } // 为列表的每一项创建上下文菜单(即长按后呼出的菜单) @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.setHeaderTitle("ContextMenu"); menu.add(0, 0, 0, "ContextMenu"); } // 单击上下文菜单后的逻辑 @Override public boolean onContextItemSelected(MenuItem item) { ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item.getMenuInfo(); String title = ((TextView) info.targetView).getText().toString(); int type = ExpandableListView.getPackedPositionType(info.packedPosition); if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) { int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition); int childPos = 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) { int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition); Toast.makeText(this, title + " - Group Index: " + groupPos, Toast.LENGTH_SHORT).show(); return true; } return false; } public class MyExpandableListAdapter extends BaseExpandableListAdapter { // 父列表数据 private String[] groups = { "group1", "group2", "group3", "group4" }; // 子列表数据 private String[][] children = { { "child1" }, { "child1", "child2" }, { "child1", "child2", "child3" }, { "child1", "child2", "child3", "child4" } }; @Override public Object getChild(int groupPosition, int childPosition) { return children[groupPosition][childPosition]; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public int getChildrenCount(int groupPosition) { return children[groupPosition].length; } // 取子列表中的某一项的 View @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { TextView textView = getGenericView(); textView.setText(getChild(groupPosition, childPosition).toString()); return textView; } @Override public Object getGroup(int groupPosition) { return groups[groupPosition]; } @Override public int getGroupCount() { return groups.length; } @Override public long getGroupId(int groupPosition) { return groupPosition; } // 取父列表中的某一项的 View @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { TextView textView = getGenericView(); textView.setText(getGroup(groupPosition).toString()); return textView; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } // 获取某一项的 View 的逻辑 private TextView getGenericView() { AbsListView.LayoutParams lp = new AbsListView.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, 48); TextView textView = new TextView(_ExpandableList.this); textView.setLayoutParams(lp); textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); textView.setPadding(32, 0, 0, 0); return textView; } }}
?