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)

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