tags: APP
Android
Common 前言
- 在 Android 5.0 之後,RecyclerView 全面取代 ListView
- 兩者呈現效果大同小異,但 RecyclerView 甚至更為強大、功能更多、效能更好
- 若不想繼續看下去,請左轉 RecyclerView 教學:連結
Adapter 的角色
AdapterView
- AdapterView 用法是把資料跟 Layout 給 bind 起來
- render 的時候 ListView 翻箱倒櫃找出資料
- 接著用指定的 Layout 把該筆資料「畫」出來,此時由 ListView 幫你處理 View 重用的細節
- 重新 Create View instance 是很花資源的事情,所以才會衍生出,想要兩個 row 的外觀長得不一樣就會不好處理的問題
Adapter
- android.widget.Adapter 是 Java 一個 Interface 規範 Adapter 應該實做哪些方法
-
Adapter 家族
-
android.widget.BaseAdapter 第一個實作 Adapter 規範的類別,是一個抽象類別
Adapter 使用時機 ArrayAdapter 資料的來源是列或list時使用 SimpleCursorAdapter 資料來源是資料庫(Cursor)查詢的結果時使用 SimpleAdapter 資料是像表格有列和欄的時候,可使用 Map 集合儲存列,在使用List收集每一列 BaseAdapter 當有客製化需求時
-
-
BaseAdapter 類別下必須實作的4個抽象方法
getCount()
:取得item的數量,通常數量就是從建構子傳入的陣列或是集合大小getItem(int position)
:取得 ListView 列表於 position 位置上的 ItemgetItemId(int position)
:取得 ListView 列表於 position 位置上的 Item 的 idgetView(int position, View convertView, ViewGroup parent)
:
設定與回傳 convertView 作為顯示在這個 position 位置的 Item 的 View
BaseAdapter Example
public class CustomGrid extends BaseAdapter {
private Context context;
private final String[] web;
private final int[] imageId;
public CustomGrid(Context context, String[] web, int[] imageId) {
this.context = context;
this.web = web;
this.imageId = imageId;
}
@Override
public int getCount() {
return web.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View grid;
// Context 動態放入mainActivity
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
grid = new View(context);
// 將grid_single 動態載入(image+text)
grid = layoutInflater.inflate(R.layout.grid_single, null);
TextView textView = (TextView) grid.findViewById(R.id.grid_text);
ImageView imageView = (ImageView) grid.findViewById(R.id.grid_image);
textView.setText(web[position]);
imageView.setImageResource(imageId[position]);
} else {
grid = (View) convertView;
}
return grid;
}
}
專案範例
- GridView 專案:https://github.com/SpicyBoyd/AndroidStudioClass/tree/master/GridView
- 如何使用BaseAdapter自訂ListView:http://givemepass.blogspot.tw/2011/10/baseadapterlistview.html
Extensive Reading 延伸閱讀
- RecyclerView与ListView的对比分析:http://blog.qiji.tech/archives/16436
- 實作 Android ListView:http://julianchu.net/2015/09/26-implement-listview.html
Reference 參考資料
- 圖示:
https://www.journaldev.com/10416/android-listview-with-custom-adapter-example-tutorial - Adapter 圖示:https://guides.codepath.com/android/Using-an-ArrayAdapter-with-ListView
- 使用 RecyclerView:http://julianchu.net/2016/03/13-recyclerview.html
- ListView中getView的原理+如何在ListView中放置多个item
http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html - Android清單元件介紹(ListView-Adapter)
https://litotom.com/2016/03/26/清單元件介紹listview-adapter/ - 『ListView』- 自訂一個繼承 BaseAdapter 的 Adapter 以實現客製化 ListView
https://xnfood.com.tw/android-listview-baseadapter/
沒有留言:
張貼留言