[索引页]
[源码下载]


系出名门Android(8) - 控件(View)之TextSwitcher, Gallery, ImageSwitcher, GridView, ListView, ExpandableList

作者: webabcd


介绍
在 Android 中使用各种控件(View)
  • TextSwitcher -文字转换器控件(改变文字时增加一些动画效果)
  • Gallery -缩略图浏览器控件
  • ImageSwitcher -图片转换器控件(改变图片时增加一些动画效果)
  • GridView -网格控件
  • ListView -列表控件
  • ExpandableList -支持展开/收缩功能的列表控件


1、TextSwitcher 的 Demo
textswitcher.xml
代码 <? xmlversion="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(BundlesavedInstanceState){
// TODOAuto-generatedmethodstub
super .onCreate(savedInstanceState);
this .setContentView(R.layout.textswithcer);

setTitle(
" TextSwithcer " );

final TextSwitcherswitcher = (TextSwitcher)findViewById(R.id.textSwitcher);
// 指定转换器的ViewSwitcher.ViewFactory
switcher.setFactory( this );

// 设置淡入和淡出的动画效果
Animationin = AnimationUtils.loadAnimation( this ,android.R.anim.fade_in);
Animationout
= AnimationUtils.loadAnimation( this ,android.R.anim.fade_out);
switcher.setInAnimation(in);
switcher.setOutAnimation(out);

// 单击一次按钮改变一次文字
ButtonbtnChange = (Button) this .findViewById(R.id.btnChange);
btnChange.setOnClickListener(
new View.OnClickListener(){
@Override
public void onClick(Viewv){
switcher.setText(String.valueOf(
new Random().nextInt()));
}
});
}

// 重写ViewSwitcher.ViewFactory的makeView(),返回一个View
@Override
public ViewmakeView(){
TextViewtextView
= new TextView( this );
textView.setTextSize(
36 );
return textView;
}
}


2、Gallery 的 Demo
gallery.xml
代码 <? xmlversion="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(BundlesavedInstanceState){
// TODOAuto-generatedmethodstub
super .onCreate(savedInstanceState);
this .setContentView(R.layout.gallery);

setTitle(
" Gallery " );

Gallerygallery
= (Gallery)findViewById(R.id.gallery);
// 为缩略图浏览器指定一个适配器
gallery.setAdapter( new ImageAdapter( this ));
// 响应在缩略图列表上选中某个缩略图后的事件
gallery.setOnItemSelectedListener( new AdapterView.OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView <?> parent,Viewv,
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 ContextmContext;

public ImageAdapter(Contextcontext){
mContext
= context;
}

public int getCount(){
return mThumbIds.length;
}

public ObjectgetItem( int position){
return position;
}

public long getItemId( int position){
return position;
}

public ViewgetView( int position,ViewconvertView,ViewGroupparent){
ImageViewimage
= 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 的 Demo
imageswitcher.xml
代码 <? xmlversion="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实现的经典的图片浏览器的Demo
public class _ImageSwitcher extends Activity implements
ViewSwitcher.ViewFactory{

private ImageSwitchermSwitcher;

@Override
protected void onCreate(BundlesavedInstanceState){
// TODOAuto-generatedmethodstub
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));

Gallerygallery
= (Gallery)findViewById(R.id.gallery);
gallery.setAdapter(
new ImageAdapter( this ));
gallery.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView <?> parent,Viewv,
int position, long id){
mSwitcher.setImageResource(mImageIds[position]);
}

@Override
public void onNothingSelected(AdapterView <?> arg0){

}
});
}

public class ImageAdapter extends BaseAdapter{

private ContextmContext;

public ImageAdapter(Contextcontext){
mContext
= context;
}

public int getCount(){
return mThumbIds.length;
}

public ObjectgetItem( int position){
return position;
}

public long getItemId( int position){
return position;
}

public ViewgetView( int position,ViewconvertView,ViewGroupparent){
ImageViewimage
= 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 ViewmakeView(){
ImageViewimage
= 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 的 Demo
gridview.xml
代码 <? xmlversion="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(BundlesavedInstanceState){
// TODOAuto-generatedmethodstub
super .onCreate(savedInstanceState);
this .setContentView(R.layout.gridview);

setTitle(
" GridView " );

GridViewgridView
= (GridView)findViewById(R.id.gridView);
// 指定网格控件的适配器为自定义的图片适配器
gridView.setAdapter( new ImageAdapter( this ));
}

// 自定义的图片适配器
public class ImageAdapter extends BaseAdapter{

private ContextmContext;

public ImageAdapter(Contextcontext){
mContext
= context;
}

public int getCount(){
return mThumbIds.length;
}

public ObjectgetItem( int position){
return position;
}

public long getItemId( int position){
return position;
}

public ViewgetView( int position,ViewconvertView,ViewGroupparent){
ImageViewimageView;
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 的 Demo
main_list_adapter.xml
代码 <? xmlversion="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 LayoutInflatermInflater;
private List < String > mData;

public MainListAdapter(Contextcontext,List < String > data){
mInflater
= LayoutInflater.from(context);
mData
= data;
}

@Override
public int getCount(){
return mData.size();
}

@Override
public ObjectgetItem( int position){
return mData.get(position);
}

@Override
public long getItemId( int position){
return position;
}

@Override
public ViewgetView( int position,ViewconvertView,ViewGroupparent){

TextViewtext;

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();
}

StringmItem
= 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;

/** Calledwhentheactivityisfirstcreated. */
@Override
public void onCreate(BundlesavedInstanceState){
super .onCreate(savedInstanceState);

setTheme(android.R.style.Theme_Light);
setContentView(R.layout.main);
mData
= getData();

// 使用自定义的列表适配器来展现数据
MainListAdapteradapter = new MainListAdapter( this ,mData);

// 如需使用系统内置的列表适配器,则可以使用类似如下的方法
// ArrayAdapter<String>adapter=newArrayAdapter<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(ListViewl,Viewv, int position, long id){
Intentintent
= 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 ExpandableListAdaptermAdapter;

@Override
protected void onCreate(BundlesavedInstanceState){
// TODOAuto-generatedmethodstub
super .onCreate(savedInstanceState);

setTitle(
" ExpandableList " );

mAdapter
= new MyExpandableListAdapter();
setListAdapter(mAdapter);
registerForContextMenu(
this .getExpandableListView());
}

// 为列表的每一项创建上下文菜单(即长按后呼出的菜单)
@Override
public void onCreateContextMenu(ContextMenumenu,Viewv,
ContextMenuInfomenuInfo){
menu.setHeaderTitle(
" ContextMenu " );
menu.add(
0 , 0 , 0 , " ContextMenu " );
}

// 单击上下文菜单后的逻辑
@Override
public boolean onContextItemSelected(MenuItemitem){
ExpandableListContextMenuInfoinfo
= (ExpandableListContextMenuInfo)item.getMenuInfo();
Stringtitle
= ((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 + " -GroupIndex: " + groupPos + " ChildIndex: " + 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 + " -GroupIndex: " + 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 ObjectgetChild( 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 ViewgetChildView( int groupPosition, int childPosition,
boolean isLastChild,ViewconvertView,ViewGroupparent){
TextViewtextView
= getGenericView();
textView.setText(getChild(groupPosition,childPosition).toString());
return textView;
}

@Override
public ObjectgetGroup( int groupPosition){
return groups[groupPosition];
}

@Override
public int getGroupCount(){
return groups.length;
}

@Override
public long getGroupId( int groupPosition){
return groupPosition;
}

// 取父列表中的某一项的View
@Override
public ViewgetGroupView( int groupPosition, boolean isExpanded,
ViewconvertView,ViewGroupparent){
TextViewtextView
= 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 TextViewgetGenericView(){
AbsListView.LayoutParamslp
= new AbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
48 );
TextViewtextView
= new TextView(_ExpandableList. this );
textView.setLayoutParams(lp);
textView.setGravity(Gravity.CENTER_VERTICAL
| Gravity.LEFT);
textView.setPadding(
32 , 0 , 0 , 0 );
return textView;
}
}
}


OK
[源码下载]

更多相关文章

  1. 利用Handler来更新android的UI
  2. 一个Demo让你掌握所有的android控件
  3. Android(安卓)旋转屏幕捕获当前屏幕的状态
  4. Android学习笔记(9)---FrameLayout中上下层可点击设置
  5. Android关机界面代码
  6. 搭建 android 代码镜像服务
  7. Android(安卓)Junit 单元测试步骤
  8. android webview 设置
  9. android - mars课程列表

随机推荐

  1. SQL:通过将两个列映射到彼此来更新表。
  2. mysql 基于position 恢复数据库
  3. MySQL导出和导入SQL脚本
  4. 如何获得MySQL中某一行的偏移量?
  5. mysql-5.7.10-winx64 绿色版安装办法
  6. mysql主从复制配置操作以及主主配置宕机
  7. 如何使用PDO从MySQL获取正确的数据类型?
  8. MySQL基本操作汇总
  9. linux运维必会MySQL企业面试题
  10. mysql 中使用聚合函数sum()后出现很长的