標籤:
引自:http://blog.csdn.net/jason0539/article/details/9918465
最近需要用ArrayAdapter,儲存一下,以後方便尋找
ArrayAdapter(數組適配器)一般用於顯示一行文本資訊,所以比較容易。
public ArrayAdapter(Context context,int textViewResourceId, List<T> objects)
上面的這行代碼來裝配資料,要裝配這些資料就需要一個串連ListView視圖對象和數組資料的適配器來做兩者的適配工作,ArrayAdapter的構造需要三個參數,依次為this,布局檔案(注意這裡的布局檔案描述的是列表的每一行的布局),資料來源(一個List集合)。同時用setAdapter()將ListView和Adapter綁定。
例子一:可以用來簡單的顯示一條文字
package jason.demo14;import java.util.ArrayList;import android.app.Activity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.ListView;public class Demo13Activity extends Activity { private ListView lv; private ArrayList<String> list = new ArrayList<String>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); lv = (ListView)findViewById(R.id.listview); ArrayAdapter<String> adapter = new ArrayAdapter<String>( this, android.R.layout.simple_expandable_list_item_1, getData()); lv.setAdapter(adapter); } private ArrayList<String> getData() { list.add("180平米的房子"); list.add("一個勤勞漂亮的老婆"); list.add("一輛寶馬"); list.add("一個強壯且永不生病的身體"); list.add("一個喜歡的事業"); return list; }}<SPAN style="BACKGROUND-COLOR: #ffffff; FONT-FAMILY: Arial"></SPAN>
注意:這裡的android.R.layout.simple_expandable_list_item_1是系統內建布局,樣式就是如下
例子二:這個例子可以增加一個ImageView,但是在設定ArrayAdapter的時候需要增加這個自訂的布局</SPAN>
public ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)
上面的第一個參數是上下文,一般為this。第二個參數是自訂的布局檔案,比如下面的就是R.layout.list_item。第三個參數是布局中用來顯示文字的TextView的id,第四個參數是資料集合,跟例一一樣
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/tv" android:layout_width="fill_parent" android:layout_height="wrap_content" /></LinearLayout>
Activity的java代碼:
package jason.demo14;import java.util.ArrayList;import android.app.Activity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.ListView;public class Demo13Activity extends Activity { private ListView lv; private ArrayList<String> list = new ArrayList<String>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); lv = (ListView)findViewById(R.id.listview); ArrayAdapter<String> adapter = new ArrayAdapter<String>( this, R.layout.list_item,//區別就在這一行和下一行,這裡是自己定義的布局檔案, R.id.tv,//這是R.layout.list_item中TextView的ID,用來確定把添加進來的資料顯示在哪個位置 getData()); lv.setAdapter(adapter); } private ArrayList<String> getData() { list.add("180平米的房子"); list.add("一個勤勞漂亮的老婆"); list.add("一輛寶馬"); list.add("一個強壯且永不生病的身體"); list.add("一個喜歡的事業"); return list; }}
效果如下:
例子3:實現更複雜的效果:
這就需要重寫getView方法了,
1. 自訂欄表樣式
image_item.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal"> <ImageView android:id="@+id/item_thumbnail" android:layout_height="48dip" android:layout_width="48dip" /> <TextView android:id="@+id/item_file_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:minHeight="?android:attr/listPreferredItemHeight" android:gravity="center_vertical" android:paddingLeft="5dip" /></LinearLayout>
2. 自訂ArrayAdapter
public class ImageListAdapter extends ArrayAdapter<File>{ private int resource; public ImageListAdapter(Context context, int resourceId, List<File> objects) { super(context, resourceId, objects); // 記錄下來稍後使用 resource = resourceId; } public View getView(int position, View convertView, ViewGroup parent) { LinearLayout imageListView; // 擷取資料 File file = getItem(position); String fileName = file.getName(); Bitmap bitmap = getBitmapFromFile(file); // 系統顯示列表時,首先執行個體化一個適配器(這裡將執行個體化自訂的適配器)。 // 當手動完成適配時,必須手動映射資料,這需要重寫getView()方法。 // 系統在繪製列表的每一行的時候將調用此方法。 // getView()有三個參數, // position表示將顯示的是第幾行, // covertView是從布局檔案中inflate來的布局。 // 我們用LayoutInflater的方法將定義好的image_item.xml檔案提取成View執行個體用來顯示。 // 然後將xml檔案中的各個組件執行個體化(簡單的findViewById()方法)。 // 這樣便可以將資料對應到各個組件上了。 // if(convertView == null) { imageListView = new LinearLayout(getContext()); LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(resource, imageListView, true);//把image_item.xml布局解析到LinearLayout裡面 } else { imageListView = (LinearLayout)convertView; } // 擷取控制項,填充資料 ImageView imageView = (ImageView) imageListView.findViewById(R.id.item_thumbnail); TextView textView = (TextView) imageListView.findViewById(R.id.item_file_name); textView.setText(fileName); imageView.setImageBitmap(bitmap); return imageListView; } // 從檔案擷取Bitmap用於填充 private Bitmap getBitmapFromFile(File file) { Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); return bitmap; } }
3. 綁定資料
private void bindFilesToList(File[] files) { List<File> fileList = new ArrayList<File>(); for(File file : files) { fileList.add(file); } ImageListAdapter adapter = new ImageListAdapter(ImageFilesListActivity.this, R.layout.image_item, fileList); setListAdapter(adapter); }
基本就是這樣了
Android -----ArrayAdapter的重寫 .