适配器及适配器控件
1.什么是适配器
Android适配器是数据和视图之间的桥梁,以便于数据在View上显示。适配器就像显示器,把复杂的东西按人可以接受的方式来展现。我们常用的适配器一共有三个:ArrayAdapter,SimpleAdapter,SimpleCursorAdapter 这三个,他们都是继承于BaseAdapter 。
2.三大适配器
(1)ArrayAdapter(只能显示单一的TextView)
案例1:基本的ArrayAdapter的使用
- 1.activity_main.xml
<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:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ListView>
</RelativeLayout>
- 2.MainActivity.java
public class MainActivity extends Activity {
private ListView myListView;//列表
private List<String> itemList;//数据
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
myListView = (ListView) findViewById(R.id.listView);
//ArrayAdapter中有三个参数
//Context context 指定现在的上下文
//int textViewResourceId 指定一个包含textview的布局文件,显示每行的信息
//List<String> objects 在listview上显示的数据信息
ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_list_item_1, itemList);//适配器
}
public void initData() {
itemList = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
itemList.add("测试数据" + i);
}
}
}
案例2:使用ArrayAdapter填充ListView
步骤:
(1):定义一个数组来存放ListView中item的内容(数据源);
(2):通过实现ArrayAdapter的构造方法创建一个ArrayAdapter对象
(3):通过ListView的setAdapter(…)方法绑定ArrayAdapter
- 1.在activity_main.xml中定义ListView控件
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</RelativeLayout>
- 2 .创建list_view.xml来格式化适配器
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:textSize="18sp"
android:layout_height="wrap_content"/>
</LinearLayout>
- 3 在MainActivity.java中编辑
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView lv;
String[] names={"张三","李四","王五","赵六","田七"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=(ListView) findViewById(R.id.lv);
//1数组
//String[] names={"张三","李四","王五","赵六","田七"};
//2创建适配器
//ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, R.layout.listview_item, R.id.tv, names);
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,names);
//3填充
lv.setAdapter(adapter);
//4.ListView的监听事件
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
String item=(String) parent.getItemAtPosition(position);
//String item1= names[position];
Toast.makeText(MainActivity.this, "选择是"+item, 0).show();
}
});
}
}
(2)SimpleAdapter(可以显示多个控件)
使用SimpleAdapter实现文本且带图片ListView
- 1.activity_main.xml
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</RelativeLayout>
- listview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<ImageView
android:id="@+id/img"
android:layout_width="40dp"
android:layout_height="40dp" />
<TextView
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="名字"
android:textSize="18sp" />
</LinearLayout>
- 3.MainActivity.java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
// 1创建数据
List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
HashMap<String, Object> map1 = new HashMap<String, Object>();
map1.put("name", "张三");
map1.put("image", R.drawable.ic_launcher);
HashMap<String, Object> map2 = new HashMap<String, Object>();
map2.put("name", "李四");
map2.put("image", R.drawable.sg);
HashMap<String, Object> map3 = new HashMap<String, Object>();
map3.put("name", "王五");
map3.put("image", R.drawable.mr);
list.add(map1);
list.add(map2);
list.add(map3);
// 2创建适配器
SimpleAdapter adapter = new SimpleAdapter(this, list,
R.layout.listview_item, new String[] { "name", "image" },
new int[] { R.id.name, R.id.img });
// 3 填充
lv.setAdapter(adapter);
// 4添加监听
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
HashMap<String, Object> map = (HashMap<String, Object>) parent
.getItemAtPosition(position);
Toast.makeText(MainActivity.this, "选择是:"+map.get("name"), 0).show();
}
});
}
}
案例二
- 1.首先依旧加入listview组件
<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:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ListView>
</RelativeLayout>
- 2.再自定义一个view用于格式化
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white" >
<ImageView
android:id="@+id/item_image"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:padding="5dp"
android:scaleType="fitXY"
android:src="@drawable/bank_boc" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/item_image"
android:layout_marginLeft="10dp"
android:orientation="vertical" >
<TextView
android:id="@+id/item_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="标题"
android:textColor="#000"
android:textSize="25sp" />
<TextView
android:id="@+id/item_data"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="内容"
android:textColor="#222"
android:textSize="20sp" />
</LinearLayout>
</RelativeLayout>
- 3.在Activity中使用SimpleAdapter
public class SimpleAdapterListActivity extends Activity {
private ListView myListView;
private List<HashMap<String, Object>> data;
private final String TITLE = "title";
private final String IMAGE = "image";
private final String DATA = "data";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myListView = (ListView) findViewById(R.id.listView);
initData();
// 参数:
// context SimpleAdapter关联的View的运行环境
// data 一个Map组成的List。在列表中的每个条目对应列表中的一行,每一个map中应该包含所有在from参数中指定的键
// resource 一个定义列表项的布局文件的资源ID。布局文件将至少应包含那些在to中定义了的ID
// from 一个将被添加到Map映射上的键名
// to 将绑定数据的视图的ID,跟from参数对应,这些应该全是TextView
SimpleAdapter simAdapter = new SimpleAdapter(
SimpleAdapterListActivity.this, data, R.layout.item_listsimple,
new String[] { TITLE, DATA, IMAGE }, new int[] {
R.id.item_title, R.id.item_data, R.id.item_image });
myListView.setAdapter(simAdapter);
}
public void initData() {
data = new ArrayList<HashMap<String, Object>>();
for (int i = 0; i < 20; i++) {
HashMap<String, Object> mapItem = new HashMap<String, Object>();
mapItem.put(TITLE, "标题" + i);
mapItem.put(DATA, "介绍" + i);
switch (i % 3) {
case 0:
mapItem.put(IMAGE, R.drawable.bank_boc);
break;
case 1:
mapItem.put(IMAGE, R.drawable.bank_fjnx);
break;
case 2:
mapItem.put(IMAGE, R.drawable.bank_visa);
break;
default:
break;
}
data.add(mapItem);
}
}
}
(3)自定义适配器 BaseAdapter(重点 为抽象类 为我们 自定义的适配器)
在我们实际的应用中,通常使用自定义适配器,自定义适配器继承BaseAdapter,下面我们使用自定义的Adapter来实现(二)中介绍的SimpleAdapter的效果,
- 1.默认xml中
<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:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ListView>
</RelativeLayout>
- 2.定义listview的布局
<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:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ListView>
</RelativeLayout>
- 3.创建实体类,存放listitem的数据
public class ListItemModel {
private String title;
private String data;
private int rid;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public int getRid() {
return rid;
}
public void setRid(int rid) {
this.rid = rid;
}
}
- 4.创建适配器,继承BaseAdapter
public class MyListAdapter extends BaseAdapter {
private List<ListItemModel> listItems;
private LayoutInflater layoutInflater;
public MyListAdapter(Context context) {
layoutInflater = LayoutInflater.from(context);
}
public List<ListItemModel> getListItems() {
return listItems;
}
public void setListItems(List<ListItemModel> listItems) {
this.listItems = listItems;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return listItems.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ListItemView myListItemView;
if (convertView == null) {
myListItemView = new ListItemView();
convertView = layoutInflater
.inflate(R.layout.item_listsimple, null);
myListItemView.setTv_title((TextView) convertView
.findViewById(R.id.item_title));
myListItemView.setTv_data((TextView) convertView
.findViewById(R.id.item_data));
myListItemView.setIv_image((ImageView) convertView
.findViewById(R.id.item_image));
convertView.setTag(myListItemView);
} else {
myListItemView = (ListItemView) convertView.getTag();
}
myListItemView.getTv_title()
.setText(listItems.get(position).getTitle());
myListItemView.getTv_data().setText(listItems.get(position).getData());
myListItemView.getIv_image().setImageResource(
listItems.get(position).getRid());
return convertView;
}
class ListItemView {
private TextView tv_title;
private TextView tv_data;
private ImageView iv_image;
public TextView getTv_title() {
return tv_title;
}
public void setTv_title(TextView tv_title) {
this.tv_title = tv_title;
}
public TextView getTv_data() {
return tv_data;
}
public void setTv_data(TextView tv_data) {
this.tv_data = tv_data;
}
public ImageView getIv_image() {
return iv_image;
}
public void setIv_image(ImageView iv_image) {
this.iv_image = iv_image;
}
}
}
- 5.在主类中引用自定义适配器
public class MyAdapterActivity extends Activity {
private ListView listView;
private String[] str_titles = { "自定义标题1", "自定义标题2", "自定义标题3", "自定义标题4",
"自定义标题5", "自定义标题6", "自定义标题7", "自定义标题8", "自定义标题9" };
private String[] str_datas = { "我的内容1", "我的内容2", "我的内容3", "我的内容4", "我的内容5",
"我的内容6", "我的内容7", "我的内容8", "我的内容9" };
private int[] rids = { R.drawable.bank_boc, R.drawable.bank_fjnx,
R.drawable.bank_visa, R.drawable.bank_boc, R.drawable.bank_fjnx,
R.drawable.bank_visa, R.drawable.bank_boc, R.drawable.bank_fjnx,
R.drawable.bank_visa };
private List<ListItemModel> myListItems;
private MyListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);
myListItems = new ArrayList<ListItemModel>();
initData();
adapter = new MyListAdapter(MyAdapterActivity.this);
adapter.setListItems(myListItems);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
Toast.makeText(MyAdapterActivity.this, "点击了" + position, 1000)
.show();
}
});
}
public void initData() {
for (int i = 0; i < str_titles.length; i++) {
ListItemModel lm = new ListItemModel();
lm.setTitle(str_titles[i]);
lm.setData(str_datas[i]);
lm.setRid(rids[i]);
myListItems.add(lm);
}
}
}
这样我们也能玩完成simpleAdapter的效果