android極簡adapter

android-adapter

android極簡adapter蕉鸳,支持list-adapter与境、expandable-list-adapter以及recycler-adapter豪治,可以非常方便的創(chuàng)建單type以及多type的adapter温亲。
github地址:https://github.com/694551594/android-adapter

gradle配置方式:

  • compile 'cn.yhq:android-adapter:1.0.2'
  • compile 'cn.yhq:android-recycler-adapter:1.0.2'

使用方式:

1、創(chuàng)建最簡單的adapter(單type)

(1)類似List<T>的數據(單List遗淳,即ListView或者GridView適配的adapter)变泄,使用SimpleListAdapter即可令哟,代碼如下:
    SimpleListAdapter<String> adapter = SimpleListAdapter.create(this, getDatas(), R.layout.layout_item1,
            new SimpleListAdapter.IItemViewSetup<String>() {
                @Override
                public void setupView(ViewHolder viewHolder, int position, String entity) {
                    viewHolder.bindTextData(R.id.item_text, entity);
                }
            });
(2)類似List<List<T>>的數據(List里面嵌套List,即ExpandableListView適配的adapter)妨蛹,使用SimpleExpandableListAdapter即可屏富,代碼如下:
 SimpleExpandableListAdapter<Group, Child> adapter =
            SimpleExpandableListAdapter.create(this, getDatas(), R.layout.layout_item1, R.layout.layout_item1, new SimpleExpandableListAdapter.IItemViewSetup<Group, Child>() {
                @Override
                public void setupGroupView(ViewHolder viewHolder, int position, Group entity, boolean isExpanded) {
                    viewHolder.bindTextData(R.id.item_text, entity.text);
                }
    
                @Override
                public void setupChildView(ViewHolder viewHolder, int groupPosition, Group groupEntity, int childPosition, Child childEntity) {
                    viewHolder.bindTextData(R.id.item_text, childEntity.text);
                }
    
                @Override
                public Child getChild(Group group, int childPosition) {
                    return group.childs.get(childPosition);
                }
    
                @Override
                public int getChildrenCount(Group group) {
                    return group.childs.size();
                }
            });
(3)RecyclerView適配的adapter,使用SimpleRecyclerListAdapter即可蛙卤,代碼如下:
 SimpleRecyclerListAdapter<String> adapter = SimpleRecyclerListAdapter.create(this, getDatas(),
        R.layout.layout_item1, new SimpleRecyclerListAdapter.IItemViewSetup<String>() {
          @Override
          public void setupView(cn.yhq.adapter.recycler.ViewHolder viewHolder, int position,
              String entity) {
            viewHolder.bindTextData(R.id.item_text, entity);
          }
        });
(4)當然狠半,如果你不想使用自帶的Simple**Adapter,你可以使用上述三種對應的ListAdapter颤难、BaseExpandableListAdapter神年、RecyclerListAdapter去實現自己的adapter。
(5)如果你的數據類型不是List<T>這種的行嗤,比如是JsonArray或者Object {List<T>}這種的已日,就需要繼承BaseAdapter<L, I>BaseExpandableAdapter<L, G, C>栅屏、RecyclerBaseAdapter<L, I>去實現自己的adapter飘千,這里舉一個自定義ListAdapter的例子:
 public class ListObjectAdapter extends BaseAdapter<ListObject, String> {
    
        public ListObjectAdapter(Context context, ListObject listData) {
            super(context, listData);
        }
    
        public ListObjectAdapter(Context context) {
            super(context);
        }
    
        @Override
        protected ListObject newInstance() {
            return new ListObject();
        }
    
        @Override
        public void clearAllItem() {
    
        }
    
        @Override
        public void addAllItem(ListObject items) {
    
        }
    
        @Override
        public void addItem(String item) {
    
        }
    
        @Override
        public void removeItem(String item) {
    
        }
    
        @Override
        public void removeItem(int position) {
    
        }
    
        @Override
        public int getCount() {
            return 0;
        }
    
        @Override
        public String getItem(int position) {
            return null;
        }
    }

    public class ListObject {
        public List<String> list;
    }

2、創(chuàng)建多type的adapter

  • 這里使用ListAdapter舉例說明栈雳,ExpandableListAdapter與RecyclerAdapter的類似护奈。
  • 多type的adapter的創(chuàng)建方式是通過注冊多種type的視圖提供器,然后根據position與對應的entity去選擇對應的視圖提供器哥纫,然后進行視圖的渲染與數據綁定霉旗。
  • 多type的adapter創(chuàng)建方式有兩種,一種是根據key值注冊視圖提供器蛀骇,一種是直接注冊帶選擇器的視圖提供器奖慌。這里分別舉例說明:
(1)根據key去注冊視圖提供器

此種方式通過調用adapter的register(key,ItemViewProvider1)方法去注冊對應類型的視圖提供器松靡,此外還需要通過setItemViewProviderKeyPolicy設置視圖提供器key的選擇策略,用來確定某個item該用哪個視圖提供器進行渲染建椰,現在我們寫一個有兩種類型的item的adapter:

示例代碼
 public class MutipleTypeListAdapter1 extends ListAdapter<MutipleTypeObject> {
      public final static int TYPE_1 = 1;
      public final static int TYPE_2 = 2;
    
      public MutipleTypeListAdapter1(Context context) {
        super(context);
        // 注冊類型1的視圖提供器
        this.register(TYPE_1, new ItemViewProvider1<MutipleTypeObject>() {
          @Override
          public int getItemViewLayoutId() {
            return R.layout.layout_item1;
          }
    
          @Override
          public void setupView(ViewHolder viewHolder, int position, MutipleTypeObject entity) {
            viewHolder.bindTextData(R.id.item_text, entity.text);
          }
        });
        // 注冊類型2的視圖提供器
        this.register(TYPE_2, new ItemViewProvider1<MutipleTypeObject>() {
          @Override
          public int getItemViewLayoutId() {
            return R.layout.layout_item2;
          }
    
          @Override
          public void setupView(ViewHolder viewHolder, int position, MutipleTypeObject entity) {
            viewHolder.bindTextData(R.id.item_text, entity.text);
          }
        });
        // 設置視圖提供器的選擇策略
        this.setItemViewProviderKeyPolicy(new IItemViewProviderKeyPolicy<MutipleTypeObject>() {
          @Override
          public int getItemViewProviderKey(int position, MutipleTypeObject entity) {
            if (entity.type == MutipleTypeObject.TYPE_1) {
              return TYPE_1;
            } else if (entity.type == MutipleTypeObject.TYPE_2) {
              return TYPE_2;
            }
            return -1;
          }
        });
      }
    }
(2)根據選擇器去選擇視圖提供器

此種方式通過調用adapter的register(ItemViewProvider2)方法去注冊對應類型的視圖提供器雕欺,與第一種方式不同的是,這種方式需要實現isForProvider方法,用來確定某個item是否使用當前視圖提供器進行渲染屠列,現在我們寫一個有兩種類型的item的adapter:

示例代碼
  public class MutipleTypeListAdapter2 extends ListAdapter<MutipleTypeObject> {
    
      public MutipleTypeListAdapter2(Context context) {
        super(context);
        // 注冊類型1的視圖提供器
        this.register(new ItemViewProvider2<MutipleTypeObject>() {
          @Override
          public boolean isForProvider(int position, MutipleTypeObject entity) {
            return entity.type == MutipleTypeObject.TYPE_1;
          }
    
          @Override
          public int getItemViewLayoutId() {
            return R.layout.layout_item1;
          }
    
          @Override
          public void setupView(ViewHolder viewHolder, int position, MutipleTypeObject entity) {
            viewHolder.bindTextData(R.id.item_text, entity.text);
          }
        });
        // 注冊類型2的視圖提供器
        this.register(new ItemViewProvider2<MutipleTypeObject>() {
          @Override
          public boolean isForProvider(int position, MutipleTypeObject entity) {
            return entity.type == MutipleTypeObject.TYPE_2;
          }
    
          @Override
          public int getItemViewLayoutId() {
            return R.layout.layout_item2;
          }
    
          @Override
          public void setupView(ViewHolder viewHolder, int position, MutipleTypeObject entity) {
            viewHolder.bindTextData(R.id.item_text, entity.text);
          }
        });
      }
    }
(3)以上兩種方式啦逆,第一種方式去獲取視圖提供器的效率較高,第二種方式因為要輪詢笛洛,所以效率較低夏志,如果item type的數量較多,建議采用第一種方式去注冊視圖提供器苛让。

3沟蔑、對于item圖片的處理:

目前ViewHolder里面只提供系統本身的api封裝,沒有封裝第三方的圖片處理框架狱杰,但是ViewHolder是調用了我的另外一個庫AndroidViewBinding瘦材,所以可以根據你自己項目里面所使用的圖片處理框架去注冊一下即可:

ViewBinder.register(ImageView.class, new CustomImageViewBinding());
ViewBinder.register(AppCompatImageView.class, new CustomImageViewBinding());

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市仿畸,隨后出現的幾起案子食棕,更是在濱河造成了極大的恐慌,老刑警劉巖错沽,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件簿晓,死亡現場離奇詭異,居然都是意外死亡千埃,警方通過查閱死者的電腦和手機憔儿,發(fā)現死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镰禾,“玉大人皿曲,你說我怎么就攤上這事∥庹欤” “怎么了屋休?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長备韧。 經常有香客問我劫樟,道長,這世上最難降的妖魔是什么织堂? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任叠艳,我火速辦了婚禮,結果婚禮上易阳,老公的妹妹穿的比我還像新娘附较。我一直安慰自己,他們只是感情好潦俺,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布拒课。 她就那樣靜靜地躺著徐勃,像睡著了一般视卢。 火紅的嫁衣襯著肌膚如雪症杏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天缅叠,我揣著相機與錄音卢鹦,去河邊找鬼臀脏。 笑死,一個胖子當著我的面吹牛冀自,可吹牛的內容都是我干的揉稚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼凡纳,長吁一口氣:“原來是場噩夢啊……” “哼窃植!你這毒婦竟也來了?” 一聲冷哼從身側響起荐糜,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤巷怜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后暴氏,有當地人在樹林里發(fā)現了一具尸體延塑,經...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年答渔,在試婚紗的時候發(fā)現自己被綠了关带。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡沼撕,死狀恐怖宋雏,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情务豺,我是刑警寧澤磨总,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站笼沥,受9級特大地震影響蚪燕,放射性物質發(fā)生泄漏。R本人自食惡果不足惜奔浅,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一馆纳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧汹桦,春花似錦鲁驶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壹罚。三九已至,卻和暖如春寿羞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赂蠢。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工绪穆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虱岂。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓玖院,卻偏偏與公主長得像,于是被迫代替她去往敵國和親第岖。 傳聞我的和親對象是個殘疾皇子难菌,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內容