最近在学习安卓,学到ListView这个控件,发现这个控件在调用方面用到了很多适配器。比如说ArrayAdapter,它们之间数据的传输是通过适配器来匹配的,说的具体一点就是适配器是把数据显示到View上的桥梁。
这部分对我来说很难理解,我按照我的思路把对适配器的理解写下来,可能有些以偏概全。
什么是适配器?
从Adapter的字面意思就能理解,是一个用来匹配适应的东西。ListView通过adapter就能知道我们想要往里面加入什么内容,如果给定泛型的话,就能知道我们要加入的是什么格式的内容。
举个例子:
ArrayAdapter<String> adapter = new ArrayAdapter<String>( MainActivity.this, android.R.layout.simple_list_item_1, data);
适配器里@Override的方法,就是让我们写上我们要告诉这个ListView的一些基本内容。上面方法内的参数就是我们要告诉listView的基本内容。
适配器的工作原理:
适配器它也是一个类,在类里面它实现了父类的几个方法:
public int getCount()
//得到数据的行数
public Object getItem(int position)
//根据position得到某一行的记录
public long getItemId(intposition)
//得到某一条记录的ID
还有最重要的:
public View getView(intposition, View convertView, ViewGroup parent)
//返回一个View
前面几个都是几个get数据的方法。但最后一个获取View的非常重要,它显式的定义了适配器将要以什么样的方式去显示我们所填充的数据,在自定义的适配器里面我们通常会给它写个布局文件,就是layout.xml文件。
说点题外话,说到显式的显示,我又想到隐式的显示,在Intent传递意图的时候有2种方式,一个是显示Intent,一个是隐式Intent,具体是什么我已经忘的一干二净,有机会我再来补充吧。
说完了工作原理,我们再说适配器的类型。常用的有三类:
1. ArrayAdapter
2. SimpleAdapter
3. SimpleCursorAdapter
当然,它们都是继承于BaseAdapter(抽象类)。
卧槽,说不完了,说到这个BaseAdapter,我又想提提这个抽象类实现的接口:ListAdapter,然后这个接口又实现了Adapter这个根接口。就此打住,记住一点:
说到Adapter不得不说到ListView,或者说用到ListView不得不提到Adapter。
说到Adapter不得不说到ListView,或者说用到ListView不得不提到Adapter。
说到Adapter不得不说到ListView,或者说用到ListView不得不提到Adapter。
在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。
而列表的显示需要三个元素:
1.ListVeiw 用来展示列表的View。
2.适配器 用来把数据映射到ListView上的中介。
3.数据 具体的将被映射的字符串,图片,或者基本组件。
根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter
其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来
(其他的太复杂,我也不去查了,我们就看书上有的最简单的ArrayAdapter)
ArrayAdapter例子:
步骤:
(1)新建一个app ,名字叫做 AdapterDemo ,先在activity_main.xml里添加一个button,用来写监听。
(2)然后新建一个类ArrayAdapterDemo继承自Activity作为我们第一个小例子的Activity,@Override 我们的onCreate方法
,新建一个xml文件arrayadapterdemo.xml作为我们的布局文件,其中包
含一个文本域和一个ListView
(3)然后回到ArrayAdapterDemo,定义一个Listview暂且叫做lv,并且lv=(ListView)findViewById(R.id.arrayadapterdemolistview); ,setContentView()为刚才的xml布局,然后为lv设置一个适配器,这里使用的是安卓原生的ArrayAdapter(Context context, inttextViewResourceId, List objects)来装配数据,要装配这些数据就需要一个连接ListView视图对象和数组数据的适配器 来两者的适配工作。
ArrayAdapter的构造需要三个参数,依次为:
1.this,布局文件(注意这里的布局文件描述的是列表的每一行的布局, 2.android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字
3.数据(一个List集合)。
最后用setAapter()完成适配的最后工作。
代码片如下(匿名内部类):
package com.example.adapterdemo;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class ArrayAdapterDemo extends Activity {
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.arrayadapterdemo);
lv=(ListView)findViewById(R.id.arrayadapterdemolistview);
lv.setAdapter(new ArrayAdapter(this,
android.R.layout.simple_expandable_list_item_1, getData()));
}
public List getData(){
List data = new ArrayList();
data.add("测试数据1");
data.add("测试数据2");
data.add("测试数据3");
data.add("测试数据4");
return data;
}
}
代码(我觉得这个好一点):
public class MainActivity extends Activity {
private String[] data = { "Apple", "Banana", "Orange"};
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayAdapter<String> adapter = new ArrayAdapter<String>( MainActivity.this, android.R.layout.simple_list_item_1, data);
ListView listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter); } }
最后吐槽下,CSDN的这个Markdown编辑器真垃圾啊!写到最后我都不想编辑了。
这里怎么有奇怪的二维码?