Android之AdapterView及其子类的介绍

Apater是适配器
AdapterView 显示一堆数据
—AbsListView
—-ListView,GridView
—AbsSpinner
—-Gallery,Spinner
ListView
—ExpandableListView

AdapterView具有的特点:
a)继承了ViewGroup
b)可以包括多个列表项,并将多个列
表项以合适的形式显示出来。
c)显示多个列表项,由Adapter提供。
调用AdapterView的setAdapter(Adapter)
方法设置Adapter即可。

I)ListView的实现第一种方式:继承Activity
1)在布局文件中配置ListView的属性。
android:entries=”@array/courses”:设置显示数组数据,
android:divider=”#ff0000”:设置每项的分割条
android:dividerHeight=”2dp”:设置分割条的高度
android:listSelector=”@drawable/list_selector”
设置每一个列表项被点击时显示不同的样式
如果listSelector没有效果加上
android:cacheColorHint=”#00000000”

   其添加setOnItemClickListener(OnItemClickListener)事件
         setOnItemLongClickListener(OnItemLongClickListener)事件

总结:使用数组创建ListView十分简单。
但这种方式能定制的内容很少,数据不灵活。
甚至连每个列表项的字号大小,颜色都不能改变。
如果想对ListView的外观,行为进行定制,
需要把ListView作为AdapterView使用,
通过Adapter控制每项的外观和行为。

2)Adapter是一个接口,
为列表项提供数据和布局文件。
常见了Adapter有:
ArrayAdapter:简单,易用的Adapter,通常用于将数组或List集合的多个值包装成多个列表项
SimpleAdapter:并不简单,功能强大的Adapter,可以用于将List集合的多个对象包装成多个列表项
SimpleCursorAdapter:与SimpleAdapter相似,只是用于包装Cursor提供的数据
BaseAdapter:通常用于被扩展,可以对各列表项进行最大限度的定制

3)在布局文件中配置ListView使用
ArrayAdapter为其添加显示数据、 配置不同布局方式。

下面的布局都是Android系统自带的:android.R.layout
simple_list_item_1:每项显示一个内容时

simple_list_item_single_choice:带有单选框的布局形式
需要结合ListView中的setChoiceMode(ListView.CHOICE_MODE_SINGLE);

simple_list_item_multiple_choice:带有多选框的布局形式
需要结合ListView中的setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

simple_list_item_checked:带有选择框的布局形式
也需要结合ListView中的setChoiceMode

总结:这种方式能够指定灵活的数据,
但是界面比较单一,
每个列表项都是TextView组件。
也 可以自定义布局文件,
并且提供一个TextView组件.

4)SimpleAdapter,在布局文件中配置ListView

使用SimpleAdapter为其添加显示数据、实现自定义布局

SimpleAdapter(Context context, List<? extends Map<String, ?>> data,int resource, String[] from, int[] to)

第一个参数是Context,android上下文
第二个参数是List<? extends Map<String,?>>
类型的集合对象,该集合中每个Map<String,?>
对象生成一个列表项
第三个参数是指定一个界面布局的ID。 使用该界面作为列表项组件
第四个参数是一个String[]类型的参数,该参数决定提取Map<String,?>
对象中哪些key对应的value来生成列表项
第五个参数是一个int[]类型的参数,
该参数决定填充哪些组件.在第三个
参数的布局文件中找组件。

总结:功能强大,可以实现更复
杂的列表项。数据复杂。
但是只能显示本地图片,
不能在线更新数据(如多个文件的下载进度)。

5)自定义Adapter适配器:

常用的方式
extends BaseAdapter
BaseAdapter是所有适配器的基类

BaseAdapter是抽象类

根据项目的情况提供自己需要的构造器
public MyAdapter(Context context,List list){
}
返回ListView中要显示的子View数量
//只需要返回构造方法中的list的条目就可以了
@Override
public int getCount() {
return this.list!=null?this.list.size():0;
}

返回一个子View,即ListView中的一个子条目显示数据的对象。
//也可以自定义返回你想要的信息

public Object getItem(int position) {
return this.list.get(position);
}

根据适配器的位置返回显示在ListVIew的位置

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

返回这个条目的整个信息

public View getView(int position, View convertView, ViewGroup parent) return convertView;
})

6)ListView的实现另外一种方式:
继承ListActivity
继承Activity
a)ListActivity默认布局中具有ListView,
就可以不用指定布局文件。
然后调用setListAdapter为其指定适配器

b)也可以自定义布局方式,
需要手动在布局文件中添加id为
@android:id/list的ListView控件
然后调用setListAdapter为其指定适配器
显示两个文本框的布局当ListView中的数据为空时,
显示其他的组件,
如下例:
指定该组件的id号为@android:id/empty

 <TextView  
    android:id="@android:id/empty"
        android:layout_width="wrap_content"
                      android:layout_height="wrap_content"
        android:text="No items."/>

7)GridView网格视图(采用自定义SimpleAdapter)
GridView用于在界面上按行,列分布的
方式来显示多个组件,

GridView和ListView有共同的父类。
有很高的相似性,
唯一的区别:ListView只显示一列,而GridView可以显示多列。

 GridView提供的属性:

android:columnWidth:设置列的宽度

 android:gravity:设置对齐方式


 android:horizontalSpacing:设置各元素之间的水平间距


 android:numColumns:设置列数

android:stretchMode:设置拉伸模式
它的值有:NO_STRETCH:不拉伸
STRETCH_SPACING:近拉伸元素之间的间距
STRETCH_SPACING_UNIFORM:表格元素本身,元素之间的间距一起拉伸
STRETCH_COLUMN_WIDTH:仅拉伸元素表格元素本身

 android:verticalSpacing:设置各元素之间的垂直间距

添加setOnItemClickListener(OnItemClickListener)
或者setOnItemSelectedListener(OnItemSelectedListener)

8)Spinner控件(采用ArrayAdapter)

使用entries设置显示数组数据

使用dropDownWidth、dropDownVerticalOffset、
popupBackground修改下拉窗口的样式

dropDownWidth:设置下拉列表的宽度

android:dropDownSelector:设置Spinner组件的下拉框被选择的动态效果属性

popupBackground:下拉框的背景

使用ArrayAdapter为其设置相应数据、Spinner样式及下拉窗口样式等内容

android.R.layout.simple_spinner_item:设置spinner的样式

adapter.setDropDownViewResouce(android.R.simple_spinner_dropdown_item):设置下拉框的样式
添加setOnItemSelectedListener(OnItemSelectedListener)事件监听器

9)AutoCompleteTextView自动完成文本框(采用ArrayAdapter)它是从EditText派生出来的,实际上也是一个文本编辑框,但比普通的编辑框多个一个功能:当用户输入一定字符之后,自动完成文本框会显示一个下拉菜单,供用户从中选择,当用户选择某个菜单项之后,AutoCompleteTextView按用
户选择自动填写该文本框。

相关属性:
android:completionHint:设置下拉框菜单中的提示标题

android:completionThreshold=”1”:设置用户至少输入几个字符才会显示提示

      android:dropDownWidth:设置下拉菜单的宽度

android:popupBackgrounp:设置下拉菜单的背景

使用AutoCompleteTextView很简单,只要为它设置一个Adapter,
该Adapter封装了AutoCompleteTextView预设的提示文本内容。

android.R.layout.simple_dropdown_item_1line:下拉框的界面

例如:百度搜索条

一.ExpandableListView组件是android中一个比较常用的组件,
当点击一个父item的时候可以将它的子item显示出来,
像手机QQ中的好友列表就是实现的类型效果。
一般采用两个布局文件,一个父Item的布局文件,一个
子Item的布局文件,使用ExpandableListView组件的
关键就是设置它的adapter,这个adapter必须继承
BaseExpandableListAdapter类,所以实现运用
ExpandableListView的核心就是学会继承这
个BaseExpanableListAdapter类

 该类的重写方法有://获取当前父Item的个数
    public int getGroupCount() {}       


                      //获取当前父Item下的子item的个数
    public int getChildrenCount(int groupPosition) {}


                      //获取当前父item的数据
    public Object getGroup(int groupPosition) {}


                      //得到子item需要关联的数据
    public Object getChild(int groupPosition, int childPosition) {}


                     //获取指定组的ID
    public long getGroupId(int groupPosition) {}


                     //返回子Item的ID
    public long getChildId(int groupPosition, int childPosition) {
    //子元素位置(相对于其它子元素)
return childPosition;
    }
   //组和子元素是否持有稳定的ID,也就是底层数据的改变不会影响到它们。
//如果为TRUE,意味着相同的ID永远引用相同的对象。
public boolean hasStableIds() {

return true;
}
//设置父Item组件
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {}

//设置子Item的组件
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {}

//是否选中指定位置上的子元素。 是否选中子元素

  public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;}

补充:自定义前面的箭头,
给ExpandableListView组件设置
属性android:groupIndicator。
该属性指定一个selector文件。
如下:

<selector xmlns:android="http://schemas.android.com/apk/res/android">   
    <!--点开父Item-->
    <item android:state_expanded="true" 
          android:drawable="@drawable/lt_open" />   
    <item android:drawable="@drawable/lt_normal" />   
</selector> 

下面我就写了一系列的适配器加载数据的代码:
关键代码:
activity_main:

<RelativeLayout 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"
    >
    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:entries="@array/msg"
        android:divider="#ab3fcc"
        android:dividerHeight="2dp"
        android:listSelector="@drawable/home_selector"
        android:id="@+id/lv"/>

</RelativeLayout>

arrays数组代码:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 定义数组 -->
    <string-array name="msg">
        <item >使用ArrayAdapter</item>
        <item >使用SimpleAdapter</item>
        <item >使用BaseAdapter</item>
        <item >使用ListActivity</item>
        <item >使用GridView</item>
        <item >使用可扩展view</item>
        <item >使用Spinner组件</item>
        <item >使用AutoCompleteTextView</item>

    </string-array>
    <string-array name="person" >
        <item>张三</item>
        <item>李四</item>
        <item>王五</item>
        <item>赵六</item>
        <item>孙七</item>
    </string-array> 
    <string-array name="pro">
        <item >江西</item>
        <item >江苏</item>
        <item >四川</item>
        <item >上海</item>
    </string-array>

</resources>

效果图如下:
这里写图片描述
代码下载:

http://download.csdn.net/detail/qq_33642117/9563267

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值