数据适配器(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);
}
}