成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Bamboy 非約束列表(俗稱:萬(wàn)能適配器 )(附源碼)

printempw / 2919人閱讀

摘要:初中生可能會(huì)操作次,耗時(shí)小時(shí)。高中生可能會(huì)把所有電腦連起來(lái),同時(shí)操控,只需要操作一次,耗時(shí)一個(gè)小時(shí)。注意該必須實(shí)現(xiàn)接口才能觸發(fā)回調(diào),否則會(huì)報(bào)錯(cuò)例類里方法里的。

v3.1更新

完善更多下拉刷新場(chǎng)景

增加【上拉分頁(yè)加載】和【無(wú)感分頁(yè)加載】

v3.0更新

增加超強(qiáng)功能的下拉刷新

v2.0更新

增加對(duì)團(tuán)隊(duì)開發(fā)的支持

增加對(duì)混合列表的支持

簡(jiǎn)介

非約束列表,
也是很多同學(xué)口中的“萬(wàn)能適配器”,
不過(guò)我并不認(rèn)同“萬(wàn)能”的這個(gè)說(shuō)法,
誰(shuí)的適配器ListView和RecyclerView通用?

預(yù)覽一下效果先:
1、單列列表

2、多列列表

3、混合列表

顯然,
從界面上看不出什么名堂,
那就先說(shuō)下我的非約束列表有什么優(yōu)勢(shì)吧。

打個(gè)比方,
某中學(xué)要給10臺(tái)電腦升級(jí)程序,
平均一臺(tái)電腦操作一次需要一個(gè)小時(shí)。

初中生可能會(huì)操作10次,
耗時(shí)10小時(shí)。

高中生可能會(huì)把所有電腦連起來(lái),
同時(shí)操控,
只需要操作一次,
耗時(shí)一個(gè)小時(shí)。

我們用普通的Adapter的話,
就好比初中生,
每次修改一個(gè)條目,
就把所有使用這個(gè)條目的類全改一遍,
無(wú)論是Activity還是Adapter,
但是用了非約束列表就不一樣了,
邏輯基本上都在Bean里,
基本上只需要改itemLayout的樣式,
和Bean里的邏輯即可。

到這里,
可能有同學(xué)會(huì)疑惑,
為什么不管Adapter?
因?yàn)椋?br>我的項(xiàng)目只需要一個(gè)Adapter,
一個(gè)Adapter,
全場(chǎng)通用!

說(shuō)得細(xì)一點(diǎn),
就是我把邏輯全部拆散重組,
Adapter架空,
只負(fù)責(zé)Activity、ViewHolder、bean之間的連通。
我個(gè)人喜歡把View和與其相對(duì)應(yīng)的數(shù)據(jù)放一起,
所以我把ViewHolder和邏輯放到了Bean里,
通過(guò)一個(gè)接口來(lái)使兩者進(jìn)行結(jié)合,
哦不,
是將數(shù)據(jù)顯示到View上。

但是,
ViewHolder那么多,
Adapter怎么將其連通起來(lái)呢?
所以我寫了一個(gè)ViewHolderManager,
ViewHolderManager負(fù)責(zé)根據(jù)條目的類型,
找到相對(duì)應(yīng)的ViewHolder,
進(jìn)行實(shí)例化并返回給Adapter。

整體流程如下圖:

好了,
原理就說(shuō)到這里,
━━━━━━━━━━━━━━━這是清理內(nèi)存的分割線━━━━━━━━━━━━━━━
下面開始聊聊我的非約束列表的使用步驟:

一:
新建一個(gè)Bean類,
里邊寫個(gè)ViewHolder內(nèi)部類,
繼承ViewHolderManager.ViewHolder,
和普通的Adapter的內(nèi)部類差不多,
不過(guò)需要注意的是,
構(gòu)造里的參數(shù)不一樣:

/**
 * ViewHolder --> 主頁(yè)的按鈕
 */
public static class MusicViewHolder extends ViewHolderManager.ViewHolder {
    public RelativeLayout rl_music;
    public TextView tv_song;
    public TextView tv_singer;

    public MusicViewHolder(ViewGroup viewGroup) {
        // 兩個(gè)參數(shù),第一個(gè)viewGroup不解釋,第二個(gè)即本ViewHolder對(duì)應(yīng)的LayoutXml
        super(viewGroup, R.layout.item_music);

        rl_music = (RelativeLayout) itemView.findViewById(R.id.rl_music);
        tv_song = (TextView) itemView.findViewById(R.id.tv_song);
        tv_singer = (TextView) itemView.findViewById(R.id.tv_singer);
    }
}

不難發(fā)現(xiàn),
構(gòu)造里多了個(gè)參數(shù),
即該ViewHolder對(duì)應(yīng)的LayoutXml.

二:
進(jìn)入ViewHolderManager,
對(duì)應(yīng)你新寫的ViewHolder,
增加一個(gè)公開靜態(tài)常量,
只要不與其他的值重復(fù)即可,
并put到itemMap里,
key為你剛寫的常量,
value為剛寫的ViewHolder的class。

/**
 * 條目類型 --> ……
 */
public static final int //……
/**
 * 條目類型 --> 新聞卡片
 */
public static final int ITEM_TYPE_NEWS = 8;
/**
 * 條目類型 --> 音樂(lè)
 */
public static final int ITEM_TYPE_MUSIC = 9;

/**
 * 加載條目類型,以及對(duì)應(yīng)的條目XML
 */
static {
    itemMap = new HashMap<>();
    ……
    itemMap.put(ITEM_TYPE_NEWS, BeanNews.NewsViewHolder.class);
    itemMap.put(ITEM_TYPE_MUSIC, BeanMusic.MusicViewHolder.class);
}

三:
回到剛才寫的Bean,
繼承FreedomBean,
在initItemType()里,
set一下剛在ViewHolderManager里定義的那個(gè)常量,

@Override
protected void initItemType() {
    setItemType(ViewHolderManager.ITEM_TYPE_MUSIC);
}

在initBindView()里,
把普通Adapter里onBindViewHolder()的代碼挪過(guò)來(lái)。

@Override
protected void initBindView(final List list) {

    setViewHolderBindListener(new ViewHolderBindListener() {
        @Override
        public void onBindViewHolder(final Activity activity, final ViewHolderManager.ViewHolder viewHolder, final int position) {
            final MusicViewHolder vh = (MusicViewHolder) viewHolder;
            final BeanMusic bean = (BeanMusic) list.get(position);

            vh.tv_song.setText(bean.getSong());
            vh.tv_singer.setText(bean.getSinger());

            vh.rl_music.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    ……
                }
            });
        }
    });
}

如果需要和Activity交互,
則Activity實(shí)現(xiàn)FreedomCallback接口,
并在onClickCallback里編寫代碼,
然后回到Bean里調(diào)用getCallback(activity).onClickCallback();

vh.rl_music.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 點(diǎn)擊事件
        // 如果不需要和Activity進(jìn)行交互,
        // 那么直接在這里寫點(diǎn)擊事件即可
        //
        // 如果需要和Activity進(jìn)行交互,
        // 那么Activity實(shí)現(xiàn)FreedomCallback接口,
        // 并在onClickCallback里編寫代碼,
        // 即可觸發(fā)回調(diào),
        // 以和Activity進(jìn)行交互。
        //
        // 注意:
        // 該Activity必須實(shí)現(xiàn)FreedomCallback接口才能觸發(fā)回調(diào),
        // 否則會(huì)報(bào)錯(cuò)
        getCallback(activity).onClickCallback(v, position, vh);
    }
});

例:
類BeanMusic里initBindView方法里的vh.rl_music.setOnClickListener()。

好了,
Bean就完成了,
Activity里使用它的方式和普通的沒(méi)什么差別,
只是聲明數(shù)據(jù)源mList的時(shí)候,
類型為Object或者不要加類型就好:

/**
 * 數(shù)據(jù)源
 */
 private List mList;

然后就可以使用FreedomAdapter了:

// 實(shí)例化RecyclerView
mAdapter = new FreedomAdapter(this, mList);
recycler.setLayoutManager(new LinearLayoutManager(this));
recycler.setItemAnimator(new DefaultItemAnimator());
recycler.setAdapter(mAdapter);

使用起來(lái)雖然沒(méi)有比普通的簡(jiǎn)單太多,
但也功能要比普通的強(qiáng)大太多啊不是么?

代碼很簡(jiǎn)單,
注釋我也寫得很全,
如果還是有疑問(wèn)的地方,
歡迎在文章下評(píng)論,
或者加入QQ討論群:569614530,
群里找我,
我是塵少。

本文github鏈接:
https://github.com/Bamboy1203...

也可以先下載apk安裝體驗(yàn):

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74175.html

相關(guān)文章

  • Android簡(jiǎn)單實(shí)現(xiàn) 萬(wàn)能配器 + 下拉刷新 + 無(wú)感分頁(yè)加載

    摘要:萬(wàn)能適配器下拉刷新無(wú)感分頁(yè)更新完善更多下拉刷新場(chǎng)景增加上拉分頁(yè)加載和無(wú)感分頁(yè)加載更新增加超強(qiáng)功能的下拉刷新更新增加對(duì)團(tuán)隊(duì)開發(fā)的支持增加對(duì)混合列表的支持簡(jiǎn)介非約束列表,也是很多同學(xué)口中的萬(wàn)能適配器,近期增加了下拉刷新和無(wú)感分頁(yè)。 萬(wàn)能適配器 + 下拉刷新 + 無(wú)感分頁(yè) v3.1更新 完善更多下拉刷新場(chǎng)景 增加【上拉分頁(yè)加載】和【無(wú)感分頁(yè)加載】 v3.0更新 增加超強(qiáng)功能的下拉刷新 v...

    Xufc 評(píng)論0 收藏0
  • Bamboy右滑關(guān)閉2.0,無(wú)需透明主題的右滑關(guān)閉(源碼)

    摘要:右滑關(guān)閉簡(jiǎn)介很多中都會(huì)有右滑關(guān)閉功能,尤其是在全面屏?xí)r代更顯得尤為重要,但是,禁止非全屏的使用透明主題,否則會(huì)引發(fā)這導(dǎo)致了體驗(yàn)最優(yōu)的右滑關(guān)閉方案則不能再使用,除非有微信那種黑科技。 SlidingShut 右滑關(guān)閉 簡(jiǎn)介 很多APP中都會(huì)有右滑關(guān)閉功能, 尤其是在全面屏?xí)r代更顯得尤為重要, 但是, Android 8.0禁止非全屏的Activity使用透明主題, 否則會(huì)引發(fā):...

    _Dreams 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<