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


作者:webabcd


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


1、TextSwitcher 的 Demo

textswitcher.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 的 Demo

gallery.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 Demo

imageswitcher.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 实现的经典的图片浏览器的 Demo

public 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 Demo

gridview.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 的 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


代码

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;

}

}

}