我是如何搭建Android快速開發(fā)框架的之UI篇(中)

接著上篇进萄,這里想分享ListAdapter已烤、RecyclerView的封裝。眾所周知苛坚,ListAdapter以及RecyclerView都是列表控件比被,Google更推薦大家使用RecyclerView。關(guān)于RecyclerView的基本使用泼舱,不在本篇的討論范圍內(nèi)等缀。

ListAdapter

ListAdapter作為ListView的數(shù)據(jù)適配器,為ListView提供數(shù)據(jù)源娇昙。在我們的頻繁使用中尺迂,發(fā)現(xiàn):對Adapter的編寫主要集中在幾部分:

  • 實現(xiàn)getView(int position, View convertView, ViewGroup parent)方法
  • 數(shù)據(jù)集合的增刪修改,頻繁手動調(diào)用 notifyDataSetChange()方法

而在getView()方法中,我們通常會做這么幾件事:

  • 設(shè)置布局文件
  • 數(shù)據(jù)與控件的綁定
  • 控件事件注冊

轉(zhuǎn)化成代碼:

 if (convertView == null) {
       convertView = View.inflate(context, getLayoutId(), null);
       holder = new ViewHolder(convertView);
       convertView.setTag(holder);
   } else {
       holder =  convertView.getTag();
   }
   
   bindItem();      //綁定數(shù)據(jù)
   setEvent();      //綁定事件
   
   return convertView;

由于Adapter可多個itemType噪裕,因此封裝的時候繽紛兩路蹲盘,RecyclerAdapter的封裝也是如此。

Step1 封裝XListAdapter膳音,作為所有Adapter的基類召衔,子類可實現(xiàn)getView()方法

XListAdapter中主要實現(xiàn)了數(shù)據(jù)集的增刪修改常用操作严蓖、事件綁定接口 等功能薄嫡。

+ addData()
+ setData()
+ clearData
+ addElement()
+ removeElement()
+ getColor()
+ getDrawable()
+ visible()
+ gone()
+ invisible()
...

Step2 封裝SimpleListAdapter,實現(xiàn)單viewType的需求

核心如下:

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        H holder = null;
        T item = data.get(position);

        if (convertView == null) {
            convertView = View.inflate(context, getLayoutId(), null);
            holder = newViewHolder(convertView);

            convertView.setTag(holder);
        } else {
            holder = (H) convertView.getTag();
        }

        convert(holder, item, position);

        return convertView;
    }

子類則擺脫了這段魔鬼一樣的代碼颗胡,只需要實現(xiàn)這三個方法:

protected abstract H newViewHolder(View convertView); //創(chuàng)建viewHolder

protected abstract int getLayoutId();       //設(shè)置布局資源id

protected abstract void convert(H holder, T item, int position);    //數(shù)據(jù)綁定與事件綁定

Step3 事件綁定接口

為了方便事件的統(tǒng)一處理毫深,我抽象了一個抽象類ListItemCallback

 public void onItemClick(int position, T model, int tag) {}         //單擊

 public void onItemLongClick(int position, T model, int tag) {}     //長按

參數(shù):

  • position : 就是getView中的position,位置
  • model : 綁定的數(shù)據(jù)實體
  • tag : 事件標(biāo)識毒姨,自己定義

a. 為什么定義的是抽象類哑蔫,而不是接口?

因為接口中的方法需要全部實現(xiàn)弧呐,而抽象類可以選擇性的override闸迷,顯然,我們通常只需要重寫onItemClick方法

b. 如何使用呢俘枫?

holder.itemView.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
         if (getCallback() != null) {
             getCallback().onItemClick(position, item, TAG_VIEW);
         }
     }
 });

c. 為什么我不選擇很常見的SparseArray那種封裝的CommonAdapter

因為我不喜歡那種編碼style腥沽,建議將Adapter單獨類

RecyclerView

RecyclerView的封裝一般體現(xiàn)在:

  • 下拉刷新、上拉加載更多
  • header鸠蚪、footer
  • divider
  • ...

鑒于此今阳,我之前搞了個ARecyclerView,主要有這些特性:

  • ARecyclerView繼承自RecyclerView茅信,它就是一個封裝了常見功能的RecyclerView盾舌,而不是繼承FrameLayout
  • ARecyclerView中實現(xiàn)了Header、Footer蘸鲸,header和Footer可以有多個
  • ARecyclerView的每一個header妖谴、footer的viewType是不同的,而大部分開源庫的header酌摇、footer的viewtype是相同的膝舅,其直接后果是界面卡頓
  • ARecyclerView可以做出幾乎任何的界面效果,可以取代ScrollView窑多,你只需要使用header或者footer
  • ARecyclerView中實現(xiàn)了上拉加載更多铸史,可以自定義加載更多的效果,只需要實現(xiàn)LoadMoreUIHandler接口即可
  • ARecyclerView并未實現(xiàn)下拉刷新功能怯伊,您可以選擇SwipeRefreshLayout或者其他的下拉刷新viewGroup包裹琳轿,即你可以自由選擇下拉刷新功能的實現(xiàn)判沟。
  • 為了方便自定義使用,特別集成了XRecyclerContentLayout控件崭篡,你可以根據(jù)業(yè)務(wù)進(jìn)行擴(kuò)展挪哄,XRecyclerContentLayout只是一個示例,當(dāng)然也可以滿足絕大部分需求了

由于其實現(xiàn)相對復(fù)雜琉闪,推薦大家可以去看看源碼迹炼,app mudule中是完整的實例

XDroid中,我新增了SimpleRecAdapter颠毙,應(yīng)對單itemType的需求斯入。具體思想和ListAdapter很相似

public abstract class SimpleRecAdapter<T, F extends RecyclerView.ViewHolder> extends RecyclerAdapter<T, F> {

    public SimpleRecAdapter(Context context) {
        super(context);
    }

    @Override
    public F onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(getLayoutId(), parent, false);
        return newViewHolder(view);
    }

    public abstract F newViewHolder(View itemView);

    public abstract int getLayoutId();

}

T 是item的實體類,F(xiàn)是ViewHolder的實體類

下一篇會談?wù)?code>ContentLayout的實現(xiàn)過程蛀蜜。

XDroid項目是我在兩年的開發(fā)中積累的一個Android快速開發(fā)框架刻两,目前包含UI層、緩存滴某、圖片加載磅摹、日志、路由霎奢、Api請求户誓、事件訂閱、工具類等幕侠。下一步會進(jìn)行mvp帝美、rx全家桶、retrofit晤硕、權(quán)限適配等工作证舟。歡迎大家提出寶貴意見,指正不足窗骑。

最后附上鏈接: https://github.com/limedroid/XDroid

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市漆枚,隨后出現(xiàn)的幾起案子创译,更是在濱河造成了極大的恐慌,老刑警劉巖墙基,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件软族,死亡現(xiàn)場離奇詭異,居然都是意外死亡残制,警方通過查閱死者的電腦和手機(jī)篓足,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門绘趋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事潜腻」粽矗” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長搁宾。 經(jīng)常有香客問我,道長倔幼,這世上最難降的妖魔是什么盖腿? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮损同,結(jié)果婚禮上翩腐,老公的妹妹穿的比我還像新娘。我一直安慰自己膏燃,他們只是感情好茂卦,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蹄梢,像睡著了一般疙筹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上禁炒,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天而咆,我揣著相機(jī)與錄音,去河邊找鬼幕袱。 笑死暴备,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的们豌。 我是一名探鬼主播涯捻,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼望迎!你這毒婦竟也來了障癌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤辩尊,失蹤者是張志新(化名)和其女友劉穎涛浙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摄欲,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡轿亮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胸墙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片我注。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖迟隅,靈堂內(nèi)的尸體忽然破棺而出但骨,到底是詐尸還是另有隱情励七,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布嗽冒,位于F島的核電站呀伙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏添坊。R本人自食惡果不足惜剿另,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贬蛙。 院中可真熱鬧雨女,春花似錦、人聲如沸阳准。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽野蝇。三九已至讼稚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绕沈,已是汗流浹背锐想。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留乍狐,地道東北人赠摇。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像浅蚪,于是被迫代替她去往敵國和親藕帜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評論 25 707
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,766評論 22 665
  • 由于抽樣地塊調(diào)查抽中了梁家莊惜傲,我們提前和村支書聯(lián)系好洽故,下午一點多從單位出發(fā),到村大隊部集合盗誊。 因為“改水記”上了中...
    快樂的櫻子閱讀 202評論 1 4
  • 積極覺察表 一时甚、今天完成狀況如何? 很差浊伙。早起高標(biāo)準(zhǔn)。閱讀低標(biāo)準(zhǔn)长捧,鍛煉無嚣鄙。 二、分析原因 今天情緒有點煩躁串结。原因是...
    再見你好_8260閱讀 145評論 0 0
  • 場景分析對于交互設(shè)計 我們之前解了場景和場景分析哑子,我們繼續(xù)下一個題目:場景分析對于交互設(shè)計那么交互設(shè)計師要如何設(shè)計...
    用戶體驗學(xué)習(xí)者閱讀 465評論 0 1