站長留言

  • ✅ 本站維護及更新歷史紀錄,詳情請參考公告
  • ✅ 有任何意見、想法,歡迎留言給Spicy知道喔
  • ✅ 固定於每周一至周五更新Blogger文章,周末不定期
程式Android 安卓

【APP/Android】各種 "Adapter" with ListView (整理)

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

  1. android.widget.Adapter 是 Java 一個 Interface 規範 Adapter 應該實做哪些方法

  1. Adapter 家族

    • android.widget.BaseAdapter 第一個實作 Adapter 規範的類別,是一個抽象類別

      Adapter 使用時機
      ArrayAdapter 資料的來源是列或list時使用
      SimpleCursorAdapter 資料來源是資料庫(Cursor)查詢的結果時使用
      SimpleAdapter 資料是像表格有列和欄的時候,可使用 Map 集合儲存列,在使用List收集每一列
      BaseAdapter 當有客製化需求時
  2. BaseAdapter 類別下必須實作的4個抽象方法

  • getCount():取得item的數量,通常數量就是從建構子傳入的陣列或是集合大小
  • getItem(int position):取得 ListView 列表於 position 位置上的 Item
  • getItemId(int position):取得 ListView 列表於 position 位置上的 Item 的 id
  • getView(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;
    }
}

專案範例

  1. GridView 專案:https://github.com/SpicyBoyd/AndroidStudioClass/tree/master/GridView
  2. 如何使用BaseAdapter自訂ListView:http://givemepass.blogspot.tw/2011/10/baseadapterlistview.html

Extensive Reading 延伸閱讀

  1. RecyclerView与ListView的对比分析:http://blog.qiji.tech/archives/16436
  2. 實作 Android ListView:http://julianchu.net/2015/09/26-implement-listview.html

Reference 參考資料

  1. 圖示:
    https://www.journaldev.com/10416/android-listview-with-custom-adapter-example-tutorial
  2. Adapter 圖示:https://guides.codepath.com/android/Using-an-ArrayAdapter-with-ListView
  3. 使用 RecyclerView:http://julianchu.net/2016/03/13-recyclerview.html
  4. ListView中getView的原理+如何在ListView中放置多个item
    http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html
  5. Android清單元件介紹(ListView-Adapter)
    https://litotom.com/2016/03/26/清單元件介紹listview-adapter/
  6. 『ListView』- 自訂一個繼承 BaseAdapter 的 Adapter 以實現客製化 ListView
    https://xnfood.com.tw/android-listview-baseadapter/

沒有留言:

張貼留言

本網站建議使用電腦或平板瀏覽