適配器及適配器控件
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的效果