在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. 【python标准库模块二】random模块学习

    random模块是用来生成随机数的模块 导入random模块 import random 生成一个0~1的随机数,浮点数 #随机生成一个0~1的随机数 print(random.random()) 生 ...

  2. Stall Reservations

    Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked ...

  3. MongoDB 索引限制

    额外开销 每个索引占据一定的存储空间,在进行插入,更新和删除操作时也需要对索引进行操作.所以,如果你很少对集合进行读取操作,建议不使用索引. 内存(RAM)使用 由于索引是存储在内存(RAM)中,你应 ...

  4. 为什么要用 Docker

    作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势. 首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多. 其次,Docker 对系统资源的利用率很 ...

  5. Ruby方法参数默认值的一个小技巧在Rails中的应用

    我们需要生成一个gravatar格式的html.image标示,于是写了如下方法: def gravatar_for(user) gravatar_id = Digest::MD5::hexdiges ...

  6. cassandra 3.x官方文档(4)---分区器

    写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...

  7. Dynamics CRM2011 导入解决方案报根组件插入错误的解决方法

    今天在还原一个老版本的解决方案,在导入时报根组件插入问题"Cannot add a Root Component 38974590-9322-e311-b365-00155d810a00 o ...

  8. Linux 环境下一些常用命令(四)

    转自 http://www.oschina.net/translate/20-advanced-commands-for-middle-level-linux-users 31. 命令: rm 'rm ...

  9. 协议系列之IP协议

    1.协议 协议(protocol)的定义:为计算机网络中进行数据交换而建立的规则.标准或约定的集合.两个终端相互通信时双方达成的一种约定,规定了一套通信规则,双方通信必须遵守这些规则.这些规则规定了分 ...

  10. sql server中高并发情况下 同时执行select和update语句死锁问题 (二)

    SQL Server死锁使我们经常遇到的问题,数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁.希望对您学习SQL Server死锁方面能有所帮助. 死锁对于DBA或是数据 ...