在J2EE中提供过一种非常好的框架--MVC框架,实现原理:数据模型M(Model)存放数据,利用控制器C(Controller)将数据显示在视图V(View)上。在Android中有这样一种高级控件,他的实现过程就类似于MVC框架。之所以称它高级,是因为他的使用不像其他控件一样,拖拽到界面上就能用,而是需要通过适配器将某些样式的数据或控件添加到其上而使用,这样的控件就是我们今天要说的AdapterView。

一:AdapterView-->V(视图)

1:作用

以列表的形式显示数据。

2:内容

AdapterView的内容一般是包含多项相同格式资源的列表。

3:特点

(1)将前端显示和后端数据分离

(2)内容不能通过ListView.add的形式添加列表项,需指定一个Adapter对象,通过它获得显示数据

(3)ListView相当于MVC框架中的V(视图)

(4)Adapter相当于MVC框架中的C(控制器)

(5)数据源相当于MVC框架中的M(模型)

(6)超出屏幕显示之后,自动加上滚动条

4:分类

(1)ListView:列表,其中只能含有一个控件TextView,

(2)Spinner:下拉列表,给用户提供选择

(3)Gallery:缩略图,已经被水平的ScrollView和ViewPicker取代,但也还算常用,是一个可以把子项以中心锁定,水平滚动的列表

(4)GridView:网格图,以表格形式显示资源,可以左右滑动的

5:事件

(1)用户单击列表项事件

◆为列表加载setOnItemClieckListener监听,重写onItemClick(发生单击事件的列表对象ListView,被单击控件对象view,在列表中的位置position,被单击列表项的行ID)方法。

(2)用户长按事件

◆为列表加载setOnItemLongClieckListener监听,重写onItemLongClick(发生单击事件的列表对象ListView,被单击控件对象view,在列表中的位置position,被单击列表项的行ID)方法。

6:数据填充

借助下面的Adapter适配器对象从数据源中进行适配

二:Adapter-->C(控制器)

1:作用

把数据源中数据以某种样式(xml文件)显示在视图中。

2:分类

(1)ArrayAdapter:他只能处理列表项内容全是文本的情况。

◆数据源:数组或者List<String>对象或者其他

(2)SimpleAdapter: 他不仅可以处理列表项全是文本的情况,当列表项中还有其他控件时,同样可以处理。

◆数据源:只能为List<Map<“键”,“值”>>形式的数据

(3)自定义Adapter:根据xml文件中定义的样式惊醒列表项的填充,适用性最强。

(4)SimpleCursorAdapter:专门用于把游标中的数据映像到列表中(我们以后再来研究)

3:自定义Adapter

1)创建类,继承自BaseAdapter

(2)重写其中的四个方法

①int getCount():返回的是数据源对象的个数,即列表项数

②Object getItem(int position):返回指定位置position上的列表

③long getItemId(int position):返回指定位置处的行ID

④View
getView():返回列表项对应的视图,方法体中

◆实例化视图填充器

◆用视图填充器,根据Xml文件,实例化视图

◆根据布局找到控件,并设置属性

◆返回View视图

三:数据填充

1:声明AdapterView对象,根据ID利用findViewById方法找到此对象

2:声明Adapter对象,根据构造方法实例化此对象。具体如下:

(1)ArrayAdapter<数据类型> adapter = new ArrayAdapter<数据类型>(context:一般指当前Activity对象,layout:每个列表项显示的布局,data:数据源变量);

(2)SimpleAdapter adapter = new SimpleAdapter(context:一般指当前Activity对象,data:数据源变量,layout:每个列表项显示的布局,new
String[]{}:数据源中的“键”,new int[]{}:显示数据源的控件ID);

(3)自定义Adapter类 adapter = new 自定义Adapter类构造方法;

3:绑定Adapter对象到Adapter上

AdapterView对象.setAdapter(Adapter对象);

四:具体应用

1:用ArrayAdapter填充ListView

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class MainActivity extends Activity
{
    private ListView
lv;
//
适配器控件------->V视图
    private ArrayAdapter<String>
adapter;
//
适配器------>C控制器
    private String[]
data = { 
"我是第1个列表项""我是第2个列表项""我是第3个列表项""我是第4个列表项",
            "我是第5个列表项""我是第6个列表项""我是第7个列表项" };//
数据源-->M
    @Override
    protected void onCreate(Bundle
savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找到ListView
        lv
= (ListView) findViewById(R.id.listView1);
        //
实现适配器,利用系统定义的样式,加载数据源
        adapter
new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,
data);
        //
R.layout.cell 自己定义视图
        //
android.R.layout.simple_list_item_1 系统定义视图样式
        //
绑定适配器到适配器控件上
        lv.setAdapter(adapter);
        //处理单击事件:列表项被单击时给出提示信息
        lv.setOnItemClickListener(new OnItemClickListener()
{
            @Override
            public void onItemClick(AdapterView<?>
parent, View view,
                    int position, long id)
{
                Toast.makeText(MainActivity.this,
                        "第" +
(position + 
1)
"项被单击按下",
Toast.LENGTH_LONG)
                        .show();
            }
        });
        //处理长时间按下事件:列表项被长时间按下时给出提示信息
        lv.setOnItemLongClickListener(new OnItemLongClickListener()
{
            @Override
            public boolean onItemLongClick(AdapterView<?>
parent, View view,
                    int position, long id)
{
                Toast.makeText(MainActivity.this,
                        "第" +
(position + 
1)
"项被长时间按下",
Toast.LENGTH_LONG)
                        .show();
                return true;
            }
        });
    }
}

结果:

2:用SimpleAdapter填充Spinner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class MainActivity extends Activity
{
    //声明Spinner
    private Spinner
sp;
    //声明Adapter
    private SimpleAdapter
adapter;
    //数据源
    private String[]
data = { 
"我是第1个列表项""我是第2个列表项""我是第3个列表项""我是第4个列表项",
            "我是第5个列表项""我是第6个列表项""我是第7个列表项""我是第8个列表项""我是第9个列表项" };//
数据源-->M
    //存放数据源
    ArrayList<Map<String,
Object>> list = 
new ArrayList<Map<String,
Object>>();
    @Override
    protected void onCreate(Bundle
savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找到Spinner
        sp
= (Spinner) findViewById(R.id.spinner1);
        //将数据添加到List<Map>中,因为SimpleAdapter只能装这样的数据
        Map<String,
Object> map;
        for (int i
0;
i < data.length; i++) {
            map
new HashMap<String,
Object>();
            map.put("data",
data[i]);
            list.add(map);
        }
        //实例化Adapter
        adapter
new SimpleAdapter(this,
list, R.layout.cell, 
new String[]
{
                "data"},
                new int[]
{ R.id.textView1 });
        //绑定Adapter到Spinner上
        sp.setAdapter(adapter);
    }
}

结果:

3:用SimpleAdapter填充GridView

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class MainActivity extends Activity
{
    //声明GridView
    private GridView
gv;
    //声明SimpleAdapter
    private SimpleAdapter
adapter;
    //数据源
    private int imageids[]
= { R.drawable.item1, R.drawable.item2,
            R.drawable.item3,
R.drawable.item4, R.drawable.item5,
            R.drawable.item6,
R.drawable.item7, R.drawable.item8,
            R.drawable.item9,
R.drawable.item10, R.drawable.item11,
            R.drawable.item12,
R.drawable.item13, R.drawable.item14,
            R.drawable.item15
};
    private String
data[] = { 
"1""2""3""4""5""6""7""8""9",
            "10""11""12""13""14""15" };
    //存放数据
    private List<Map<String,
Object>> lists;
    @Override
    protected void onCreate(Bundle
savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找到GridView
        gv
= (GridView) findViewById(R.id.gridView1);
        //封装数据到List上
        lists
new ArrayList<Map<String,
Object>>();
        Map<String,
Object> maps;
        for (int i
0;
i < imageids.length; i++) {
            maps
new Hashtable<String,
Object>();
            maps.put("image",
imageids[i]);
            maps.put("data",
data[i]);
            lists.add(maps);
        }
        //适配数据到适配器上
        adapter
new SimpleAdapter(this,
lists, R.layout.cell, 
new String[]
{
                "image""data" },
                new int[]
{ R.id.imageView1, R.id.textView1 });
        //绑定适配器到GridView上
        gv.setAdapter(adapter);
                                                      
                                                      
                                                      
    }
}

结果:

4:自定义AdapterView填充Gallery

◆自定义Adapter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//自定义Adapter
public class MyAdapter extends BaseAdapter
{
    //上下文
    private Context
context;
    //资源
    private int imageids[];
    //构造方法
    public MyAdapter(Context
context, 
int imageids[])
{
        this.context
= context;
        this.imageids
= imageids;
    }
    //返回数据源长度
    @Override
    public int getCount()
{
        return imageids.length;
    }
    //返回对应位置处的数据
    @Override
    public Object
getItem(
int position)
{
        return imageids[position];
    }
    //返回对应位置的行ID
    @Override
    public long getItemId(int position)
{
        return position;
    }
    //返回列表项的显示样式视图
    @Override
    public View
getView(
int position,
View convertView, ViewGroup parent) {
        //ImageView控件
        ImageView
iv = 
new ImageView(context);
        //添加资源到控件上
        iv.setImageResource(imageids[position]);
        //控件在父级控件的显示样式
        iv.setLayoutParams(new Gallery.LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.FILL_PARENT));
        //返回视图
        return iv;
    }
}

◆主视图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MainActivity extends Activity
{
    //声明Gallery
    private Gallery
gy;
    //声明自定义Adapter
    private MyAdapter
adapter;
    //数据源
    private int imageids[]
= { R.drawable.w1,R.drawable.q1, R.drawable.q2, R.drawable.q3,
            R.drawable.q4,
R.drawable.q5, R.drawable.q6, R.drawable.q7, R.drawable.q8, R.drawable.q9 };
    @Override
    protected void onCreate(Bundle
savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找到Gallery
        gy
= (Gallery) findViewById(R.id.gy);
        //实例化适配器
        adapter
new MyAdapter(this,
imageids);
        //绑定适配器到Gallery上
        gy.setAdapter(adapter);
    }
}

◆结果

还有一种SimpleCursorAdapter由于和数据库相关,我们以后在研究,这里只是介绍了AdapterView与Adapter之间的相互关系与使用,应该熟练掌握哦。。。Fighting

Adapterview和adapter的联系的更多相关文章

  1. Android高级控件--AdapterView与Adapter

    在J2EE中提供过一种非常好的框架--MVC框架,实现原理:数据模型M(Model)存放数据,利用控制器C(Controller)将数据显示在视图V(View)上.在Android中有这样一种高级控件 ...

  2. Android开发教程 - 使用Data Binding(六)RecyclerView Adapter中的使用

    本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...

  3. Android中Adapter和Bridge模式理解和应用

    一 Adapter模式 意图: 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作. 适用性: 使用一个已存在的类,而它的接口 ...

  4. 使用具体解释及源代码解析Android中的Adapter、BaseAdapter、ArrayAdapter、SimpleAdapter和SimpleCursorAdapter

    Adapter相当于一个数据源,能够给AdapterView提供数据.并依据数据创建相应的UI.能够通过调用AdapterView的setAdapter方法使得AdapterView将Adapter作 ...

  5. PinnedHeaderListView实现删除

    项目中用到四个List集合展示一个页面,并且每个页面都会有一个标题栏.找了半天资料决定用PinnedHeaderListView开源项目.最后需求又来了,需要一个删除的功能,又去网上找资料,发现没有实 ...

  6. Android用户界面布局(layouts)

    Android用户界面布局(layouts) 备注:view理解为视图 一个布局定义了用户界面的可视结构,比如activity的UI或是APP widget的UI,我们可以用下面两种方式来声明布局: ...

  7. 3d ListView翻译

    作为一个刚毕业的大学生,我要提醒自己时时刻刻要学习. 最近做listview看到很久以前的一个demo,高手如云啊,我们就只有好好加油了. 这是索尼公司的一个员工写的学习博客,由于本人英文能力有限是按 ...

  8. Spinnerd的功能和用法

    此处的Spinner其实是一个列表选择框.不过Android的列表选择框并不是需要下拉列表的,而是相当于弹出一个菜单供用户选择. Spinner和Gallery都继承了AbsSpinner,AbsSp ...

  9. ListView原理

    表明转载自http://blog.csdn.net/iispring/article/details/50967445 在自己定义Adapter时,我们经常会重写Adapter的getView方法,该 ...

随机推荐

  1. centos 7 安装nvidia显卡驱动

    How to install Nvidia drivers in CentOS 7 - Tutorial :  http://www.dedoimedo.com/computers/centos-7- ...

  2. 一些重要的计算机网络协议(IP、TCP、UDP、HTTP)

    一.计算机网络的发展历程 1.计算机网络发展 与其说计算机改变了世界,倒不如说是计算机网络改变了世界.彼时彼刻,你我都因网络而有了交集,岂非一种缘分? 计算机与网络发展大致经历如下过程:

  3. python学习之路前端-HTML

    HTML概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以 ...

  4. JavaScript for 循环

    循环可以将代码块执行指定的次数. JavaScript 循环 如果您希望一遍又一遍地运行相同的代码,并且每次的值都不同,那么使用循环是很方便的. 我们可以这样输出数组的值: 一般写法: documen ...

  5. Docker 列出镜像

    使用 docker images 显示本地已有的镜像. $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu ...

  6. Latex:TexStudio的使用

    http://blog.csdn.net/pipisorry/article/details/54565608 Texsdudio 快捷键 The keyboard shortcuts can be ...

  7. python模块collections中namedtuple()的理解

    Python中存储系列数据,比较常见的数据类型有list,除此之外,还有tuple数据类型.相比与list,tuple中的元素不可修改,在映射中可以当键使用.tuple元组的item只能通过index ...

  8. python 3 dict函数 神奇的参数规则

    >>> dict({1:2},2=3)SyntaxError: keyword can't be an expression>>> dict({1:2},**{2: ...

  9. EBS业务学习之应付管理

    应付款系统是供应链管理的最后一个环节,它使公司能够支付供应商提供的货物和服务的费用.供应链管理的目标是保持低库存量但又有充足的存货以满足要求,仓库中的库存就等于钱,因此,应付款管理的目标是尽可能地推迟 ...

  10. oracle伪列

    Oracle的伪列以及伪表 oracle系统为了实现完整的关系数据库功能,系统专门提供了一组成为伪列(Pseudocolumn)的数据库列,这些列不是在建立对象时由我们完成的,而是在我们建立时由Ora ...