Android应用程序用户界面(八)

数据适配器(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是布局资源中放置每项文本的TextViewidobjects是在列表视图中显示的对象。

接口方法

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参数的构造函数
可以创建一个复杂的布局来描绘每一项的视图,然后将视图中的用以显示每一项内容的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);
    }
}

带TextViewId构造函数

原文

http://wear.techbrood.com/reference/android/widget/ArrayAdapter.html#ArrayAdapter(android.content.Context, int)

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