系出名门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;
}
}
}

更多相关文章

  1. android两种方式实现发送短信的功能代码
  2. Android Wear 控件——WearableListView(附Demo)
  3. 原始Android的目标机代码结构
  4. 在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)
  5. 一个Demo让你掌握所有的android控件
  6. 第一行代码笔记1
  7. Android中自定义控件

随机推荐

  1. Android学习开发路线图
  2. Android 广播接收器注册与注销源码分析
  3. Android插件开发初探——分析篇
  4. Android Studio 单元测试
  5. android wifi 连接笔记
  6. Android学习笔记(38):Handler消息传递处
  7. Android在MediaMuxer和MediaCodec录制视
  8. Android 开发使用 Gradle 配置构建库模块
  9. Activity的launchMode相关
  10. 购买Android应用