數據適配器(ArrayAdapter)
ArrayAdapter
是由一個任意對象的數組支撐的BaseAdapter
的具體類。默認情況下,這個類期望提供的包含單獨一個TextView
資源的id
。如果你想要一個更加複雜的佈局,使用另外帶一個參數id
的構造函數。該資源id
應該指向一個在更大布局資源中的TextView
。
無論如何引用一個TextView
,它會用數組中每個對象的toString()
方法返回字符串填充內容。你可以添加自定義對象的列或數組並重寫你的對象的toString()
方法以決定在列表中的每一項顯示什麼文本。
爲了使用除了TextView
的其他界面元素(例如ImageView
)來顯示數組元素,或者使用一些toString()
方法之外的數據來填充視圖,你需要重寫getView(int, View, ViewGroup)
方法,返回你想要的那類視圖。
方法
構造函數
ArrayAdapter
提供了以下六種構造函數:
ArrayAdapter(Context context, int resource);
ArrayAdapter(Context context, int resource, int textviewResourceId);
ArrayAdapter(Context context, int resource, T[] objects);
ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects);
ArrayAdatper(Context context, int resouce, List<T> objects);
ArrayAdapter(Context context, int resource, int textViewID, List<T> objects);
其中context
爲當前的上下文背景,一般爲資源所屬的活動(在活動內構造ArrayAdapter
此參數使用this
即可);resource
是一個佈局文件ID
,該佈局文件中只能包含一個TextView
以實例化每項的視圖;textViewResourceId
是佈局資源中放置每項文本的TextView
的id
。objects
是在列表視圖中顯示的對象。
接口方法
ArrayAdapter
有以下幾個供其他組件調用的接口方法:
//在數組末尾添加特定的對象
void add(T object);
//在數組末尾添加特定的對象集合
void addAll(Collection<? extends T> collection);
//在數組末尾添加特定的多個元素
void addAll(T... items);
//從列表中清除所有元素
void clear();
//由外部資源創建一個新的ArrayAdapter
static ArrayAdapter<CharSequence> createFromResource(Context context, int textArrayResId);
//獲取與這個ArrayAdapter關聯的上下文
Context getContext();
int getCount();
//獲得以下拉框中顯示數據集的特定位置的數據的View
View getDropDownView(int position,View convertView,ViewGroup parent);
//返回一個可以使用過濾模式約束數據的過濾器
Filter getFilter();
T getItem(int position);
long getItemId(int position);
//返回數組中特定元素的位置
int getPosition(T item);
View getView(int position, View convertView, ViewGroup parent);
//在數組的特定索引處插入對象
void insert(T object, int index);
//通知綁定的數據觀察者下面的數據已經改變,反映這些數據的任何視圖都應該刷新
void notifyDataChanged()
//從數組中移除指定的對象
void remove(T object);
//設置創建下拉視圖的資源
void setDropDownViewResource(int resource);
//控制是否改變列表的方法自動調用notifyDataSetChanged
void setNotifyOnChange(boolean notifyOnChange);
//使用特定的Comparator爲數組當前的內容排序
sort(Comparator<? super T> comparator);
構造函數使用示例
不指定佈局文件中的TextView資源的ID的構造函數的佈局文件中只能包含單個TextView,不能含有其他元素,其佈局文件爲:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="35dp"
android:paddingLeft="15dp"/>
代碼
package lemon.learnandroid;
import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class ListViewActivity extends ListActivity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
String[] myStringArray = {"張三","李四","王五"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.single_textview, myStringArray);
ListView listView = getListView();
listView.setAdapter(adapter);
}
}
可以創建一個複雜的佈局來描繪每一項的視圖,然後將視圖中的用以顯示每一項內容的TextView的id作爲構造器的參數作爲構造函數。這樣可以產生根據複雜的效果。
佈局文件
<?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="match_parent">
<TextView
android:id="@+id/text"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:textSize="35dp"
android:layout_alignParentLeft="true"/>
<Button android:id="@+id/button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/text"
android:layout_alignParentRight="true"
android:text="刪除"/>
</RelativeLayout>
代碼
package lemon.learnandroid;
import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class ListViewActivity extends ListActivity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
String[] myStringArray = {"張三","李四","王五"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.textview_with_button, R.id.text, myStringArray);
ListView listView = getListView();
listView.setAdapter(adapter);
}
}