Last active
August 29, 2015 14:07
-
-
Save ssd863419/0d3ba33684febd8ad3c8 to your computer and use it in GitHub Desktop.
ssdAndroid 測試說明BaseAdapter的使用, ListView, List, Map, viewHolder
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example.administrator.test; | |
import android.app.Activity; | |
import android.content.Context; | |
import android.os.Bundle; | |
import android.view.LayoutInflater; | |
import android.view.View; | |
import android.view.ViewGroup; | |
import android.widget.BaseAdapter; | |
import android.widget.ImageView; | |
import android.widget.ListView; | |
import android.widget.TextView; | |
import java.util.ArrayList; | |
import java.util.HashMap; | |
import java.util.List; | |
import java.util.Map; | |
/** | |
* Created by Administrator on 2014/10/13. | |
*/ | |
public class BaseAdapterDemo extends Activity { | |
private ListView lv; | |
public List<Map<String, Object>> data; | |
@Override | |
public void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.main); | |
lv = (ListView) findViewById(R.id.lv); | |
/* 獲取將要綁定的數據, 存入data中 */ | |
data = getData(); | |
MyAdapter adapter = new MyAdapter(this); | |
lv.setAdapter(adapter); | |
} | |
private List<Map<String, Object>> getData() { | |
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); | |
Map<String, Object> map; | |
for (int i = 0 ; i < 10 ; i++) { | |
map = new HashMap<String, Object>(); | |
map.put("img", R.drawable.ic_launcher); | |
map.put("title", "肯德基"); | |
map.put("info", "有這麼好吃嗎???"); | |
list.add(map); | |
} | |
return list; | |
} | |
/* ViewHolder 靜態類 */ | |
static class ViewHolder { | |
public ImageView img; | |
public TextView title; | |
public TextView info; | |
} | |
class MyAdapter extends BaseAdapter { | |
private LayoutInflater mInflater = null; | |
private MyAdapter(Context context) { | |
this.mInflater = LayoutInflater.from(context); | |
} | |
@Override | |
public int getCount() { | |
return data.size(); | |
} | |
@Override | |
public Object getItem(int position) { | |
return position; | |
} | |
@Override | |
public long getItemId(int position) { | |
return position; | |
} | |
@Override | |
public View getView(int position, View convertView, ViewGroup parent) { | |
ViewHolder holder; | |
if (convertView == null) { | |
holder = new BaseAdapterDemo.ViewHolder(); | |
convertView = mInflater.inflate(R.layout.list_item, null); | |
holder.img = (ImageView) convertView.findViewById(R.id.img); | |
holder.title = (TextView) convertView.findViewById(R.id.title); | |
holder.info = (TextView) convertView.findViewById(R.id.info); | |
convertView.setTag(holder); | |
} else { | |
holder = (BaseAdapterDemo.ViewHolder) convertView.getTag(); | |
} | |
holder.img.setBackgroundResource((Integer) data.get(position).get("img")); | |
holder.title.setText((String) data.get(position).get("title")); | |
holder.info.setText((String) data.get(position).get("info")); | |
return convertView; | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
android:orientation="horizontal" android:layout_width="match_parent" | |
android:layout_height="match_parent"> | |
<ImageView | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:id="@+id/img" /> | |
<LinearLayout | |
android:orientation="vertical" | |
android:layout_width="fill_parent" | |
android:layout_height="wrap_content"> | |
<TextView | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:id="@+id/tv" | |
android:textSize="20sp" /> | |
<TextView | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:id="@+id/info" | |
android:textSize="14sp" /> | |
</LinearLayout> | |
</LinearLayout> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
android:orientation="vertical" android:layout_width="match_parent" | |
android:layout_height="match_parent"> | |
<ListView | |
android:layout_width="fill_parent" | |
android:layout_height="wrap_content" | |
android:id="@+id/lv" | |
android:fastScrollEnabled="true" /> | |
</LinearLayout> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Adapter(適配器) | |
適配器對象作為AdapterView之間的一個橋樑,並為這一觀點的基礎數據。適配器提供的數據項的訪問。適配器也作出負責的數據集給每個項目。 | |
簡單的來說就是資料和元件間溝通的橋樑 | |
Adapter有以下幾種間接子類別: | |
ArrayAdapter | |
BaseAdapter | |
CursorAdapter | |
HeaderViewListAdapter | |
ListAdapter | |
ResourceCursorAdapter | |
SimpleAdapter | |
SimpleCursorAdapter | |
SpinnerAdapter | |
WrapperListAdapter | |
getCount() | |
適配器內的資料個數 | |
public int getCount() { | |
return title.length; | |
} | |
getItem(int position) | |
在指定位置的數據 | |
public Object getItem(int position) { | |
return title[position]; | |
} | |
getItemId(int position) | |
獲取的id在顯示的列表中的位置 | |
public long getItemId(int position) { | |
return position; | |
} | |
/* 獲取有getView(int, 查看, ViewGroup的) 創建的視圖的指定項目 */ | |
getItemViewType(int position) { | |
return position; | |
} | |
getView(int position, View convertView, ViewGroup parent) | |
public View getView(int position, View convertView, ViewGroup parent) { | |
/* 自定義類別, 表達個別listItem中的view物件集合 */ | |
ViewTag viewTag; | |
if(convertView == null) { | |
//取得listItem容器 view | |
convertView = myInflater.inflate(R.layout.adapter, null); | |
//建構listItem內容view | |
viewTag = new ViewTag( | |
(ImageView) convertView.findViewById(R.id.MyAdapter_ImageView_icon), | |
(TextView) converView.findViewById(R.id.MyAdapter_TextView_title), | |
(TextView) convertView.findViewById(R.id.MyAdapter_TextView_info) | |
); | |
//設置容器內容 | |
convertView.setTag(viewTag); | |
} else { | |
viewTag = (ViewTag) convertView.getTage(); | |
} | |
//設定內容圖案 | |
switch(position) { | |
case 0: | |
viewTag.icon.setBackgroundResource(R.drawable.taipei); | |
break; | |
case 1: | |
viewTag.icon.setBackgroundResource(R.drawable.taichung); | |
break; | |
case 2: | |
viewTag.icon.setBackgroundResource(R.drawable.kaohsiung); | |
break; | |
} | |
//設定標題文字 | |
viewTag.title.setText(title[position]); | |
//設定內容文字 | |
viewTag.info.setText(info[position]); | |
return convertView; | |
} | |
Adapter(適配器)還蠻常會看到的,因為如果想客製化介面元件的話,一般都需要用到Adapter(適配器)改變元件為自定義形式, | |
最常用的就是BaseAdapter這個子類,一般形態ArrayAdapter也蠻常用的,不過ArrayAdapter都是用在沒什麼改變時調用, | |
如果想自定義一般都會做用到BaseAdapter這個子類 | |
BaseAdapter | |
ListView listView = (ListView) findViewById(R.id.listView1); | |
CharSequence[] list = MemorandumDate; | |
CharSequence[] list2 = MemorandumNote; | |
CharSequence[] list3 = MemorandumPW; | |
BaseAdapter adapter = new MyAdapter(this, list, mID, list2, list3, mReminder); | |
listView.setAdapter(adapter); | |
BaseAdapter与其他Adapter有些不一样,其他的Adapter可以直接在其构造方法中进行数据的设置,比如 | |
SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.list_item, | |
new String[] {"1","2","3"}, new int[] {1, 2, 3}); | |
在BaseAdapter中需要实现一个继承自BaseAdapter的类,并且重写里面的很多方法 | |
class MyAdapter extends BaseAdapter { | |
private Context context; | |
public MyAdapter(Context context) { | |
this.context = context; | |
} | |
@Override | |
public int getCount() { | |
return 0; // 此適配器中所代表的數據的條目數 | |
} | |
@Override | |
public Object getItem(int position) { | |
return null; // 獲取索引對應的數據 | |
} | |
@Override | |
public long getItemId(int position) { | |
return 0; // 取得列表中數據對應的id | |
} | |
@Override | |
public View getView(int position, View convertView, ViewGroup parent) { | |
return null; //最重要的View | |
} | |
} | |
-------------------------------------------- | |
關於getView()的處理, 重點說明 | |
以下為寫法1, 沒有任何處理, 非常不推薦, 很影響效能 (因為每次都要創建View) | |
@Override | |
public View getView(int position, View convertView, ViewGroup parent) { | |
View item = mInflater.inflate(R.layout.list_item, null); | |
ImageView img = (ImageView) item.findViewById(R.id.img); | |
TextView info = (TextView) item.findViewById(R.id.info); | |
img.setImageResource(R.drawable.ic_launcher); | |
info.setText("world"); | |
return item; | |
} | |
以下為寫法2, 通過緩存convertView, 判斷緩存中不存在View, 才創建View, 如果存在View, 那就直接利用, 藉以提升性能 | |
@Override | |
public View getView(int position, View convertView, ViewGroup parent) { | |
if(convertView == null) { | |
convertView = mInflater.inflate(R.layout.list_item, null); | |
} | |
ImageView img = (ImageView) convertView.findViewById(R.id.img); | |
TextView info = (TextView) vonvertView.findViewById(R.id.info); | |
img.setImageResource(R.drawable.ic_launcher); | |
info.setText("world"); | |
return convertView; | |
} | |
以下為寫法3, 通過convertView + ViewHolder來實現, | |
ViewHolder是一個靜態類, 使用ViewHolder的關鍵好處, 就是緩存了顯示數據的View, 加快了UI的響應速度 | |
當判斷convertView == null時, 系統就是根據設計好的List的布局, 來給convertView賦值, | |
並生成一個viewHolder來綁定convertView裡面的各個View控件 | |
再用convertView的setTag, 將viewHolder設置到Tag中 | |
以便系統第2次繪製ListView時, 從Tag中取出 | |
/* 先定義好ViewHolder靜態類 */ | |
{ | |
public ImageView img; | |
public TextView info; | |
} | |
@Override | |
public View getView(int position, View convertView, ViewGroup parent) { | |
ViewHolder holder; | |
if(convertView == null) { | |
holder = new ViewHolder(); | |
convertView = mInflater.inflate(R.layout.list_item, null); | |
ImageView img = (ImageView) item.findViewById(R.id.img); | |
TextView info = (TextView) item.findViewById(R.id.info); | |
convertView.setTag(holder); | |
} else { | |
holder = (ViewHolder) convertView.getTag(); | |
holder.img.setImageResource(R.drawable.ic_launcher); | |
holder.info.setText("world"); | |
} | |
return convertView; | |
} | |
ViewHolder模式通过getView()方法返回的视图的标签(Tag)中存储一个数据结构, | |
这个数据结构包含了指向我们要绑定数据的视图的引用,从而避免每次调用getView()的时候调用findViewById() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment