用什么高層封裝實現(xiàn)多條目聊天界面—【直播app開發(fā)進(jìn)階】

高層封裝.png
本文為菜鳥窩作者蔣志碧的連載岳悟。“從 0 開始開發(fā)一款直播 APP ”系列來聊聊時下最火的直播 APP派桩,如何完整的實現(xiàn)一個類"騰訊直播"的商業(yè)化項目
視頻地址:http://www.cniao5.com/course/10121

【從 0 開始開發(fā)一款直播 APP】3.1 高層封裝之 Adapter — ListView & GridView
【從 0 開始開發(fā)一款直播 APP】3.2 高層封裝之 Adapter — RecyclerView 實現(xiàn)單布局展示
【從 0 開始開發(fā)一款直播 APP】3.3 高層封裝之 Adapter -- RecyclerView 實現(xiàn)多條目展示
【從 0 開始開發(fā)一款直播 APP】3.4 高層封裝之 Adapter -- RecyclerView 優(yōu)雅的添加 Header构诚、Footer


一、多條目 Adapter 封裝實現(xiàn)聊天界面

上章已經(jīng)講解了 RecyclerView 的基本封裝铆惑,這次對于多條目展示進(jìn)行講解范嘱,效果如下:

RecyclerView.Adapter 的 getItemViewType(int position) 這個方法送膳,可以根據(jù)當(dāng)前位置獲取一個 viewType 最終會傳到 onCreateViewHolder() 這個方法中, 通過一個標(biāo)識來判斷條目的布局丑蛤。

1.1叠聋、定義一個接口,用來獲取布局

public interface MutipleTypeSupport<T> {
    //根據(jù)當(dāng)前條目獲取布局
    int getLayoutId(T t);
}

1.2受裹、在原來的Adapter基礎(chǔ)上做修改碌补,將MutipleTypeSupport接口傳入,讓用戶傳遞布局類型

private MutipleTypeSupport<T> mMutipleTypeSupport;
public RecyclerViewAdapter(Context context,List<T> datas,MutipleTypeSupport typeSupport){
    this(context,-1,datas);
    this.mMutipleTypeSupport = typeSupport;
}

1.3棉饶、根據(jù) getItemViewType 獲取當(dāng)前位置的 item 類型厦章, position 就是當(dāng)前 item 的值

//調(diào)用 onCreateViewHolder() 方法之前調(diào)用 getItemViewType()
@Override
public int getItemViewType(int position) {
    if (mMutipleTypeSupport != null){
        return mMutipleTypeSupport.getLayoutId(mDatas.get(position));
    }
    return super.getItemViewType(position);
}

@Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //判斷是否需要多布局  
        if (mMutipleTypeSupport != null){
            mLayoutId = viewType;
        }

        View itemView = mInflater.inflate(mLayoutId,parent,false);
        return new RecyclerViewHolder(itemView);
    }

1.4、其它方法不變照藻,所有代碼

public abstract class RecyclerViewAdapter<T> extends RecyclerView.Adapter<RecyclerViewHolder> {

    protected int mLayoutId;
    protected List<T> mDatas;
    protected Context mContext;
    private LayoutInflater mInflater;
    private MutipleTypeSupport<T> mMutipleTypeSupport;

    public RecyclerViewAdapter(Context context,List<T> datas,MutipleTypeSupport typeSupport){
        this(context,-1,datas);
        this.mMutipleTypeSupport = typeSupport;
    }

    public RecyclerViewAdapter(Context context, int layoutId, List<T> datas) {
        this.mContext = context;
        this.mLayoutId = layoutId;
        this.mDatas = datas;
        this.mInflater = LayoutInflater.from(mContext);
    }

    //調(diào)用onCreateViewHolder方法之前調(diào)用getItemViewType
    @Override
    public int getItemViewType(int position) {
        //如果支持多布局袜啃,返回所有布局
        if (mMutipleTypeSupport != null){
            return mMutipleTypeSupport.getLayoutId(mDatas.get(position));
        }
        return super.getItemViewType(position);
    }

    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        
        //多布局支持
        if (mMutipleTypeSupport != null){
            mLayoutId = viewType;
        }

        View itemView = mInflater.inflate(mLayoutId,parent,false);
        return new RecyclerViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolder holder, final int position) {
        //ViewHolder優(yōu)化
        bindData(holder,mDatas.get(position),position);
    }

    /**
     * 把必要參數(shù)傳進(jìn)去
     * @param holder RecyclerViewHolder
     * @param t 數(shù)據(jù)
     * @param position 當(dāng)前位置
     */
    protected abstract void bindData(RecyclerViewHolder holder, T t,int position);

    @Override
    public int getItemCount() {
        return mDatas.size();
    }
}

封裝完就寫的 Demo 看看效果吧。

二幸缕、多布局 Demo 實現(xiàn)

2.1群发、 MutipleAdapter 繼承 RecyclerViewAdapter ,通過 getLayoutId() 傳遞布局

public class MutipleAdaper extends RecyclerViewAdapter<Item> {

  public MutipleAdaper(Context context, List<Item> datas) {
        super(context, datas, new MutipleTypeSupport<Item>() {
            @Override
            public int getLayoutId(Item item) {
                if (item.getType() == 1){//該處1是通過 item 傳過來的
                    return R.layout.list_item;
                }else {
                    return R.layout.list_item1;
                }
            }
        });
    }

    @Override
    protected void bindData(RecyclerViewHolder holder, final Item item, int position) {
        holder.setText(R.id.tv1,item.getTv1())
                .setImageResource(R.id.img,item.getRes())
        .setOnClickListener(R.id.tv1, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(mContext,item.getTv1(),Toast.LENGTH_SHORT).show();
            }
        });
    }
}

**2.2发乔、 AdapterActivity **

public class AdapterActivity extends BaseActivity {

    private MutipleAdaper mMutipleAdaper;
    private RecyclerView mRecyclerView;

    @Override
    protected void setToolbar() {
    }

    @Override
    protected void setListener() {
    }

    //填充數(shù)據(jù)
    @Override
    protected void initData() {
        Datas = new ArrayList<>();
        for (int i = 1; i <= 30; i++) {
            if (i % 2 == 0) {   
                Datas.add(new Item(R.drawable.tab_publish_normal,"我 get 新技能 " + i,0));//根據(jù) Item 類 最后一個參數(shù)確定填充數(shù)據(jù)的不同
            }else {
                Datas.add(new Item(R.drawable.tab_publish_normal,"你 get 新技能 " + i,1));
            }
        }
        mMutipleAdaper = new MutipleAdaper(this,Datas);
        mRecyclerView.setAdapter(mMutipleAdaper);
    }

    @Override
    protected void initView() {
        mRecyclerView = obtainView(R.id.recyclerView);
        mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
    }

    @Override
    protected int getLayoutId() {
        return R.layout.activity_adapter;
    }
}

2.3熟妓、 Item 類

public class Item {
    private int res;//圖片
    private String tv1;//文字
    private int type;//類型

    public Item(int res, String tv1,int type) {
        this.res = res;
        this.tv1 = tv1;
        this.type = type;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public int getRes() {
        return res;
    }

    public void setRes(int res) {
        this.res = res;
    }

    public String getTv1() {
        return tv1;
    }

    public void setTv1(String tv1) {
        this.tv1 = tv1;
    }

}

對于RecyclerView 實現(xiàn)多布局講解完畢,下一章繼續(xù)為大家講解 RecyclerView 封裝之優(yōu)雅添加 Header列疗、Footer滑蚯。

總結(jié)

多條目的封裝

1、在單條目基礎(chǔ)上通過構(gòu)造函數(shù)傳遞一個提供布局的接口抵栈,通過 ViewType 類型判斷到底使用什么布局。
2坤次、在 getItemViewType() 方法中判斷布局類型古劲,在 onCreateViewHolder() 方法中判斷是否需要多布局,根據(jù)用戶需要實現(xiàn)不同的構(gòu)造函數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缰猴,一起剝皮案震驚了整個濱河市产艾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滑绒,老刑警劉巖闷堡,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疑故,居然都是意外死亡杠览,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門纵势,熙熙樓的掌柜王于貴愁眉苦臉地迎上來踱阿,“玉大人管钳,你說我怎么就攤上這事∪砩啵” “怎么了才漆?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長佛点。 經(jīng)常有香客問我醇滥,道長,這世上最難降的妖魔是什么超营? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任鸳玩,我火速辦了婚禮糟描,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘船响。我一直安慰自己,他們只是感情好见间,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布聊闯。 她就那樣靜靜地躺著米诉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪史侣。 梳的紋絲不亂的頭發(fā)上拴泌,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音惊橱,去河邊找鬼蚪腐。 笑死税朴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的正林。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼鼻忠,長吁一口氣:“原來是場噩夢啊……” “哼哪亿!你這毒婦竟也來了粥烁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤芥永,失蹤者是張志新(化名)和其女友劉穎钝吮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奇瘦,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年醇坝,在試婚紗的時候發(fā)現(xiàn)自己被綠了次坡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡宋距,死狀恐怖谚赎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诱篷,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布视粮,位于F島的核電站橙凳,受9級特大地震影響笑撞,放射性物質(zhì)發(fā)生泄漏岛啸。R本人自食惡果不足惜茴肥,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瞬铸。 院中可真熱鬧,春花似錦嗓节、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绸罗。三九已至豆瘫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間育灸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工描扯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留趟薄,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓恩够,卻偏偏與公主長得像羡铲,于是被迫代替她去往敵國和親蜂桶。 傳聞我的和親對象是個殘疾皇子也切,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

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