Android基礎------Adapter適配器

適配器及適配器控件


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>
    1. 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的效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章