Android常用适配器控件

列表控件用于显示数据集合,Android不是使用一种类型的控件管理显示和数据,而是将这两项功能分布用列表控件和适配器来实现。列表控件扩展了android.widget.AdapterView的类,包括ListView、GridView、Spinner和Gallery。

1)基本的列表控件ListView

    ListView控件垂直显示一组项,通常通过编写一个扩展android.app.ListActivity的新活动来使用ListView。ListActivity包含一个ListView,可以调用setListAdapter()方法来为ListView设置数据。前面介绍过适配器将列表控件链接到数据,帮助为列表控件准备子视图,可单击ListView中的某一项来立即执行操作,或选择它们以稍后对所选择项集合采取操作。

Demo1:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" > <ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >
</ListView> <Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="Submit Selection" >
</Button> </LinearLayout>

我们通过改写系统的提供的布局android.R.layout.list,向其中添加一个Button。注意:这里ListView的ID的规范:必须使用@android:id/list,因为ListActivity需要在布局中找到一个R.layout.list的ListView。

其次还需要注意的是:在布局LinearLayout中指定的ListView的高度,我们希望Button永远显示在在屏幕上,无论ListView中有多少项,我们不希望滚动到页面底部才能看到按钮。所以这里ListView的layout_height设置为0,然后使用layout_weight表面此空间应该占据父容器中的所有可用空间,同时为Button预留了空间。

最后我们未Button按钮添加了一个响应函数doClick。所以在我们的MainActivity中需要实现doClick方法。

代码清单:

public class MainActivity extends ListActivity {

	private ListView lv = null;
private Cursor cursor;
private int idCol = -1;
private int nameCol = -1;
private int noteCol = -1; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list); lv = getListView();
cursor = managedQuery(People.CONTENT_URI, null, null, null, People.NAME);
String cols[] = new String[] {People.NAME};
int [] views = new int[] {android.R.id.text1}; idCol = cursor.getColumnIndex(People._ID);
nameCol = cursor.getColumnIndex(People.NAME);
noteCol = cursor.getColumnIndex(People.NOTES); SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_multiple_choice,
cursor, cols, views); this.setListAdapter(adapter); lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
} public void doClick(View view) {
int count = lv.getCount();
SparseBooleanArray viewItems = lv.getCheckedItemPositions();
for(int i = 0; i < count; i++) {
if(viewItems.get(i)) {
cursor.moveToPosition(i);
long id = cursor.getLong(idCol);
String name = cursor.getString(nameCol);
String notes = cursor.getString(noteCol);
Toast.makeText(this, "info: id="+id+" name="+name+" notes="+notes, Toast.LENGTH_LONG).show();
}
}
}
}

代码中:我们首先调用setContentView()方法设置活动的用户界面,在适配器的设置中我们为ListView的每一行传递了Android所提供了另一个视图android.R.layout.simple_list_item_multiple_choice,这将导致导致每一行拥有一个TextView与一个CheckBox。通过查看这个布局文件,将会看到其实是CheckedTextView,继承于TextView,这个特殊的TextView专门用于ListView的。它的TextView的ID为android.R.id.text1。

为了让用户能够选择多行,我们设置了ListView.CHOICE_MODE_MULTIPLE属性。

最后为了实现用于提交功能我们添加了一个Button,并为其添加了响应方法doClick。在doClick()方法中我们调用ListView.getCheckedItemPositions()返回一个boolean类型数组,表面是否选择了某一项。然后我们迭代ListView所有项,如果选择了相应行,viewItems.get(i)将返回true。当从ListView获得已经选择的位置编号之后我们就可以使用Cursor的moveToPosition()移动到相应位置读取数据了。

2)网格控件GridView

Android有一个GridView控件可通过网格的形式显示信息。GridView的使用模式是首先在布局文件中定义网格,然后使用android.widget.ListAdapter将数据绑定到网格。下面我们同样以显示联系人为Demo,只不过这次是以网格的形式显示出来:

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/grid"
android:padding="10dp"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:numColumns="auto_fit"
android:columnWidth="100dp"
android:stretchMode="columnWidth"
android:gravity="center">
</GridView>
public class MainActivity extends Activity {

	@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); GridView gv = (GridView)this.findViewById(R.id.grid);
Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI, null, null, null, ContactsContract.Contacts.DISPLAY_NAME);
String cols[] = new String[] {ContactsContract.Contacts.DISPLAY_NAME};
int [] views = new int[] {android.R.id.text1}; int idCol = cursor.getColumnIndex(ContactsContract.Contacts._ID);
int nameCol = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
int noteCol = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_SOURCE); SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1,
cursor, cols, views); gv.setAdapter(adapter);
}
}

网格显示了设备上联系人的姓名。代码中MainActivity扩充了Activity,而不是ListActivity,然后使用setContentView()来设置GridView的布局,最后为了设置适配器,我们调用了GridView的setAdapter()方法。注意:网格使用的适配器是ListAdapter,由于列表是一维的,而网格是二维的,所以网格实际上显示了面向列表的数据。

3)下拉框控件Spinner

Spinner就像一个下拉菜单,通常用于从相对较短的选择列表中进行选择,如果选择列表太长,会自动添加一个滚动条。我们可以通过XML布局简单实例化Spinner。

<Spinner
android:id="@+id/spinner"
android:prompt="@string/spinnerPrompt"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

下拉框控件在静止时显示一个值,当用户单击小箭头时,显示一个列表提供给用户选择一个新值。填充此列表的方式和填充其他列表控件的方式相同,都是使用适配器。

public class MainActivity extends Activity {

	@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.spinner); Spinner spinner = (Spinner)this.findViewById(R.id.spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.planets, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
}
}
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="planets">
<item>Monday</item>
<item>Tuesday</item>
<item>Wednesday</item>
<item>Thursday</item>
<item>Friday</item>
<item>Saturday</item>
<item>Sunday</item>
</string-array>
</resources>

代码中首先通过setContentView来设置当前布局,然后找到相应的Spinner。通过ArrayAdapter.createFromResource()定义了微调框在正常模式下的外观,然后使用adapter.setDropDownViewResource()设置弹出列表模式的微调框。

4)水平滚动的列表控件Gallery

Gallery控件是一种可水平滚动的列表控件,焦点始终位于列表中央,此控件通常在触摸屏模式下用在相册,既可以通过XML布局也可以通过代码实例化Gallery。

<Gallery
android:id="@+id/gallery"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>

Gallery控件通常用于显示图像,所以适配器可能会针对图像特殊化,为此Android提供了一个名为BaseAdapter的抽象类,我们通过扩展它,自定义适配器。

Demo:

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/gridView"
android:padding="10dp"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:numColumns="auto_fit"
android:gravity="center">
</GridView>

activity_main.xml中有一个主要布局,其中包含了一个GridView定义,我们需要从该布局获取GridView的引用。然后实例化一个MyAdapter,继承于BaseAdapter。

public class MainActivity extends Activity {

	@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); GridView gv = (GridView)this.findViewById(R.id.gridView);
MyAdapter adapter = new MyAdapter(this);
gv.setAdapter(adapter); } public class MyAdapter extends BaseAdapter {
private int convertViewCounter = 0;
private Context context;
private LayoutInflater inflater; private int imgId[] = {R.drawable.img1, R.drawable.img2, R.drawable.img3,
R.drawable.img4, R.drawable.img5, R.drawable.img6};
private Bitmap[] images = new Bitmap[imgId.length];
private Bitmap[] Thumbs = new Bitmap[imgId.length]; class ViewHolder {
ImageView image;
} public MyAdapter(Context context) {
// TODO Auto-generated constructor stub
this.context = context;
inflater = LayoutInflater.from(context); for(int i = 0; i < imgId.length; i++) {
images[i] = BitmapFactory.decodeResource(context.getResources(), imgId[i]);
Thumbs[i] = Bitmap.createScaledBitmap(images[i], 100, 100, false);
}
} @Override
public int getCount() {
// TODO Auto-generated method stub
return imgId.length;
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return images[position];
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder;
if(convertView == null) {
convertView = inflater.inflate(R.layout.gridimage, null);
convertViewCounter++; holder = new ViewHolder();
holder.image = (ImageView)convertView.findViewById(R.id.gridImageView);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
} holder.image.setImageBitmap(Thumbs[position]);
return convertView;
}
}
}

[置顶] Android常用适配器控件的更多相关文章

  1. 【风马一族_Android】第4章Android常用基本控件

    第4章Android常用基本控件 控件是Android用户界面中的一个个组成元素,在介绍它们之前,读者必须了解所有控件的父类View(视图),它好比一个盛放控件的容器. 4.1View类概述 对于一个 ...

  2. Android 常用UI控件之TabHost(5)Tab栏在底部且在最上层也不盖tab页

    tab栏在底部 <TabHost android:id="@android:id/tabhost" android:layout_width="match_pare ...

  3. Android 常用UI控件之TabHost(4)实现当Tab栏有多个tab时,可以左右滑动

    <!-- <HorizontalScrollView android:id="@+id/horizontalScrollView1" android:layout_wi ...

  4. Android 常用UI控件之TabHost(2)简单示例

    1,布局 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tool ...

  5. Android 常用UI控件之TabHost(1)TabHost的两种布局方式

    TabHost是Android中的tab组件. TabHost布局文件的基本结构 TabHost下有个layout,这个layout中有TabWidget与FrameLayout.TabWidget是 ...

  6. Android 常用系统控件

    1. 日期选择器 DatePickerDialog 2. 时间选择器 TimePickerDialog 3. 单选按钮 RadioButton 4. 多选按钮 CheckBox 5. 下拉列表 Spi ...

  7. Android 常用UI控件之TabHost(3)在4.0不显示图标的解决方案

    1,自定义 TabWidget 上每个tab的view 2,用多个图片

  8. Android 常用UI控件之Tab控件的实现方案

    实现Tab的方式有多种 1,ActionBar有两种模式可以实现,但是已经过期 tab模式tab在顶部,分裂模式tab在底部(同时所有action item都在底部). 2,PagerTitleStr ...

  9. Android 的重要控件 ListView (听说是最难最常用的控件)

    这个打字有点慢了,左手受伤了,不过很幸运,左手小拇指没事(这就可以愉快地使用快捷键啦!),虽然有伤,但还是得坚持总结,不只是为自己,还为未来的你们铺路,希望我写的,对你们有帮助. 提前给自己一个祝福: ...

随机推荐

  1. Endnote从头开始五:修改output style(转载)

    Endnote从头开始五:修改output style Endnote中虽然有大量的期刊格式,但是并不能囊括所有我们需要的style,所以学会自己制作或编辑已有的期刊格式是很重要的,本节内容是Endn ...

  2. perl eval

    eval 表达式: eval 块: eval 在第一种形式,通常称为一个字符串eval EXPR 返回值是被解析的和被执行的作为一个小小的Perl程序. 表达式的值(是它本身决定的在标量上下文环境)是 ...

  3. Eclipse完美汉化教程

    首先我们打开http://www.eclipse.org/babel/downloads.php下载语言包. 方法一:可以复制图片里的地址通过Eclipse下载,Help→Install New So ...

  4. KMP原理、分析及C语言实现

    (是在matrix67博客基础上整理而来,整理着:华科小涛@http://www.cnblogs.com/hust-ghtao/) 有些算法可以让人发疯,KMP算法就是一个.在网上找了很多资料讲的都让 ...

  5. Direct UI 思想阐述(好多相关文章)

    在界面开发中,目前DirectUI是个热门的技术名称,因为众多的知名公司都是用DirectUI方式作出了很炫丽的界面.而对于大多数熟悉Win32控件,熟悉MFC开发的开发人员来说,我们应该做何选择? ...

  6. Swift - 设置程序的应用图标和启动界面

    一个应用,无论发布到App Store,还是安装到用户的屏幕上,都需要一个标志性的图标.同时,在应用启动时也要有个启动画面,否则启动时将会是纯黑的屏幕. 1,在项目的“General”选项卡下的“Ap ...

  7. hdu 4550 贪婪 思考题 权

    http://acm.hdu.edu.cn/showproblem.php?pid=4550 想了挺久,然后各种分类 最终AC,假设是现场,对自己没信心的话,预计还是要WA,,,,,,然后搜题解,发现 ...

  8. VS2013中安装配置和使用Boost库

    源地址:http://www.itnose.net/detail/6077953.html 时间:2014.07.24 地点:基地 ---------------------------------- ...

  9. 在Delphi中使用C++对象(两种方法,但都要改造C++提供的DLL)

    Delphi是市场上最好的RAD工具,但是现在C++占据着主导地位,有时针对一个问题很难找到Delphi或Pascal的解决方案.可是却可能找到了一个相关的C++类.本文描述几种在Delphi代码中使 ...

  10. linux log系统图

    log系统图 先贴图,怎么样,效果还不错吧,根据个人理解画的,如果不行将就用着吧.   解说 syslog是一种机制,在wiki中说这种机制可以使用udp,tcp,unix socket等把日志记录在 ...