Android複習之旅--ListView中Adapter的使用
阿新 • • 發佈:2018-11-20
在應用程式中,經常會用ListView以列表的方式來顯示資料,那麼下面就開始對ListView進行簡單的介紹。
列表顯示需要三個要素:
- ListView
- 介面卡
- 資料
其中,介面卡是將資料顯示到ListView的橋樑,使用好介面卡是重中之重
用於顯示ListView的介面卡有ArrayAdapter、SimpleAdapter、SimpleCursorAdapter和BaseAdapter等。
ArrayAdapter
/** * Context context:上下文 * int resource:佈局檔案(可選,使用自己定義的xml佈局中的控制元件時指定) * int textViewResourceId:佈局資源內的元件id * T[]或List<T> objects:資料 */ ArrayAdapter adapter = new ArrayAdapter<T>(context, [resource,] textViewResourceId, objects); 例子: // 字串陣列作為資料 String [] data= {"Ada", "Ben", "Candy", "David", "Ella"} ; ArrayAdapter adapter=new ArrayAdapter(this, android.R.layout.simple_list_item_2, data); listView.setAdapter(adapter); // List資料 ArrayAdapter adapter=new ArrayAdapter(this, android.R.layout.simple_list_item_2, getData()); listView.setAdapter(adapter); private List<String> getData(){ List<String> data = new ArrayList<String>(); data.add("測試資料1"); data.add("測試資料2"); data.add("測試資料3"); data.add("測試資料4"); return data; }
SimpleAdapter
/** * Context context:上下文 * List<? extends Map<String, ?>> data:資料 * int resource:佈局檔案 * String[] from:map資料的名字 * int[] to:對應佈局資源內元件的id */ SimpleAdapter adapter = new SimpleAdapter(context, data, resource, from, to) ; 例子: SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.simple, new String[]{"title", "icon"}, new int[]{R.id.title, R.id.icon}); listView.setAdapter(adapter); private List<Map<String, Object>> getData(){ List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Map<String, Object> map = new HashMap<String, Object>(); map.put("title", "摩托羅拉"); map.put("icon", R.drawable.icon1); list.add(map); map = new HashMap<String, Object>(); map.put("title", "諾基亞"); map.put("icon", R.drawable.icon2); list.add(map); map = new HashMa<String, Object>(); map.put("title", "小米"); map.put("icon", R.drawable.icon3); list.add(map); return list; }
SimpleCursorAdapter
/** * Context context:上下文 * int layout:佈局檔案 * Cursor c:資料庫的遊標 * String[] from:資料庫表中的欄位陣列 * int[] to:對應佈局檔案內元件的id */ SimpleCursorAdapter adapter = new SimpleCursorAdapter(context, layout, c, from, to) 例子: Cursor cursor = db.rawQuery("select * from info", null); SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.simplecursor, cursor, new String[]{"title", "icon"}, new int[]{R.id.title, R.id.icon}); listView.setAdapter(adapter); 資料庫表: | _id | title | icon | | 1 | 摩托羅拉 | R.drawable.icon1 | | 2 | 小米2s | R.drawable.icon2 | | 3 | 諾基亞 | R.drawable.icon3 |
BaseAdapter
在這裡就不把原始和優化後的做對比了,直接寫優化後的BaseAdapter
// ...忽略novels的來源
NovelsAdapter adapter = new NovelsAdapter(this, novels);
listView.setAdapter(adapter);
public class NovelsAdapter extends BaseAdapter {
private Context context;
private List <NovelInfo> novels; //設定資料
public NovelsAdapter(Context context, List <NovelInfo> novels) {
this. context = context ;
this. novels = novels ;
}
@Override
public int getCount() {
return novels.size();
}
@Override
public Object getItem(int position) {
return novels.get(position) ;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolder holder;
if (view == null){
// 獲取佈局檔案中的控制元件
view = LayoutInflater.from(context).inflate(R.layout.novel_item, null) ;
holder = new ViewHolder() ;
holder.name= (TextView) view.findViewById(R.id.tv_novel_name) ;
holder.author = (TextView) view.findViewById(R.id.tv_novel_author) ;
holder.type = (TextView) view.findViewById(R.id. tv_novel_type) ;
view.setTag(holder); //打一個標記
} else{
holder = (ViewHolder) view.getTag(); //取出標記
}
// 為控制元件繫結資料
NovelInfo novel = (NovelInfo) getItem(position) ;
holder.name.setText(novel.name) ;
holder.author.setText(novel.author) ;
holder.type.setText (novel.typeName) ;
return view;
}
static class ViewHolder{
TextView name;
TextView author;
TextView type;
}
}
NovelInfo.java:
public class NovelInfo {
public String name;// 小說名稱
public String author;// 小說作者
public String type;// 小說型別
}
還有就是儘量避免在getView()中進行耗時操作,應使用非同步的方式為item的佈局設定資料,如果是在需要同步,則要在Adapter初始化時將資料載入好,然後再在getView()中繫結資料。
其實現在ListView已經算是過時了,現在的大神們都是使用RecyclerView。RecyclerView的功能非常強大,能實現ListView和GridView還有瀑布流等效果,從ListView轉換為GridView只需幾行程式碼。
網上有很多大神們分享的關於RecyclerView的案例,大家可以google搜尋幾篇文章來學習