適配器設計模式淺析 + Adapter打造一個Tablayout

概述

適配器模式可以把一個類的接口變換成客戶端所期待的另一種接口稿饰。從而使原本接口不匹配而無法在一起工作的兩個類能夠在一起工作。巴拉巴拉...

好了辖众,閑話少說嘁傀。適配器模式我們平時開發(fā)當中不一定常用(看個人風格),但是一定沒少見衫生。比如裳瘪,早前的 ListView就用了這模式,還有一個 SimpleAdapter罪针。再比如彭羹,我們現(xiàn)在常見的 RecyclerView的自定義 Adapter等等等等。

這次我們就結合例子泪酱,自己寫一個 Tablayout頂部導航標簽布局派殷,來看一看這個Adapter設計模式的用處。

  • 創(chuàng)建 Adapter
    首先墓阀,按照習慣毡惜,我們先創(chuàng)建一個 Adapter的抽象類:
public abstract class BaseAdapter {

    // 定義標簽數(shù)量
    protected abstract int getCount();
    // 創(chuàng)建標簽的 View
    protected abstract View getView(View parent, int index);

}

兩個方法分別用于獲取標簽的數(shù)量和創(chuàng)建標簽的 ItemView。然后我們再實現(xiàn)這個 BaseAdapter :

public class TabLayoutAdapter extends BaseAdapter{
    private List<String> data;

    public TabLayoutAdapter(){
        data = new ArrayList<>();
    }

    public TabLayoutAdapter setData(List<String> data1){
        data.clear();
        data.addAll(data1);
        // 鏈式結構
        return this;
    }

    @Override
    protected int getCount() {
        return data.size();
    }

    @Override
    protected View getView(View parent, int index) {
        // 注釋1斯撮, 創(chuàng)建一個 Item
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_tab, null);
        TextView textView = itemView.findViewById(R.id.tab_text);
        textView.setText(data.get(index));
        // 測試
        if (index == 3) textView.setTextColor(Color.RED);
        // 注釋 2 返回 Item
        return itemView;
    }
}

看到上面TabLayoutAdapter 實現(xiàn)類的結構经伙,如果我們經(jīng)常自定義RecyclerView的Adapter那一定不會陌生。注釋 1和注釋 2創(chuàng)建了 Layout的一個ItemView返回勿锅。數(shù)據(jù)長度和 ItemView返回之后就交由父布局處理了帕膜。接下來我們來創(chuàng)建一個簡單的TabLayout枣氧,處理一下這個 ItemView和ItemLength:

  • TabLayout
/**
 * 碧云天
 * 
 * MyTabLayout
 */
public class MyTabLayout extends ScrollView {

    private LinearLayout mLinearLayout;
    private BaseAdapter mBaseAdapter;
    private int itemCount;

    public MyTabLayout(Context context) {
        this(context, null);
    }

    public MyTabLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MyTabLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs, defStyleAttr);
    }

    private void init(Context context, AttributeSet attrs, int defStyleAttr){
        mLinearLayout = new LinearLayout(context);
        mLinearLayout.setOrientation(HORIZONTAL);
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        mLinearLayout.setLayoutParams(layoutParams);
        //注釋 3, 我們這個 View繼承自 ScrollView垮刹,只能有一個字View
        // 所以我們給它添加一個 LinearLayout作瞄,來裝所有的 ItemView
        addView(mLinearLayout);
    }

    public void setAdapter(BaseAdapter baseAdapter) {
        if (baseAdapter == null){
            throw  new NullPointerException("Adapter is null");
        }
        mBaseAdapter = baseAdapter;
        itemCount = mBaseAdapter.getCount();
        addItem();
    }

    private void addItem(){
       for (int i = 0 ; i < itemCount; i ++){
           //注釋 4 向布局 LinearLayout循環(huán)添加 所有 ItemView
           mLinearLayout.addView(mBaseAdapter.getView(mLinearLayout, i));
       }
    }
}

這里的 MyTabLayout 繼承自 ScrollView ,這樣為了可以實現(xiàn)滑動危纫。因為 ScrollView 只能添加一個 子View或者一個子布局宗挥,無法添加所有的 ItemView。所以在上面注釋 3處我們給它添加一個LinearLayout种蝶,我們往LinearLayout里添加 ItemView契耿。在 setAdapter之后,注釋 4的地方我們循環(huán)添加 ItemView螃征。

  • 使用

定義好了搪桂,下面就開始使用了。按照步驟盯滚,應該先準備好數(shù)據(jù)的數(shù)組竖幔。然后創(chuàng)建一個 Adapter對象税娜,給 Adapter對象設置數(shù)據(jù)监署。最后調(diào)用 TabLayout的 setAdapter方法設置適配器:

public class MainActivity extends AppCompatActivity {
    private MyTabLayout mTableLayout;
    private List<String> data = new ArrayList<>();
    private BaseAdapter mTabLayoutAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTableLayout = findViewById(R.id.my_tab);
        data.add("首頁");
        data.add("手機");
        data.add("美妝");
        data.add("運動");
        data.add("食品");
        init();
    }

    private void init(){
        mTabLayoutAdapter = new TabLayoutAdapter().setData(data);
        // 設置適配器
        mTableLayout.setAdapter(mTabLayoutAdapter);
    }
}

效果:


Adapter.PNG

當然杭煎,我們這次寫的這個 TabLayout這個例子是非常low的。因為這次講的不是自定義 View的東西背率,而是用例子實現(xiàn)一下 Adapter設計模式话瞧。主要講設計模式,所以自定義布局這次就不再優(yōu)化了寝姿。
Demo :AdapterDesign

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末交排,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子饵筑,更是在濱河造成了極大的恐慌埃篓,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件根资,死亡現(xiàn)場離奇詭異架专,居然都是意外死亡,警方通過查閱死者的電腦和手機嫂冻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門胶征,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塞椎,“玉大人桨仿,你說我怎么就攤上這事“负荩” “怎么了服傍?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵钱雷,是天一觀的道長。 經(jīng)常有香客問我吹零,道長罩抗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任灿椅,我火速辦了婚禮套蒂,結果婚禮上,老公的妹妹穿的比我還像新娘茫蛹。我一直安慰自己操刀,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布婴洼。 她就那樣靜靜地躺著骨坑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柬采。 梳的紋絲不亂的頭發(fā)上欢唾,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音粉捻,去河邊找鬼礁遣。 笑死,一個胖子當著我的面吹牛肩刃,可吹牛的內(nèi)容都是我干的亡脸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼树酪,長吁一口氣:“原來是場噩夢啊……” “哼浅碾!你這毒婦竟也來了?” 一聲冷哼從身側響起续语,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤垂谢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疮茄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滥朱,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年力试,在試婚紗的時候發(fā)現(xiàn)自己被綠了徙邻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡畸裳,死狀恐怖缰犁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤帅容,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布颇象,位于F島的核電站,受9級特大地震影響并徘,放射性物質發(fā)生泄漏遣钳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一麦乞、第九天 我趴在偏房一處隱蔽的房頂上張望蕴茴。 院中可真熱鬧,春花似錦姐直、人聲如沸荐开。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晃听。三九已至,卻和暖如春砰识,著一層夾襖步出監(jiān)牢的瞬間能扒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工辫狼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留初斑,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓膨处,卻偏偏與公主長得像见秤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子真椿,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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