現(xiàn)在的app幾乎都是伴隨著底部導(dǎo)航欄,
頁面往往存在著ScrollView或者RecyclerView等可滑動的ViewGroup,
因此刷新返回頂部的功能是必備的融蹂,
通過點(diǎn)擊底部導(dǎo)航欄返回頂部刷新顯然是最合適的旺订,
先說明一下項目結(jié)構(gòu):
底部導(dǎo)航欄切換fragment的實(shí)現(xiàn)就是FrameLayout+tab,并在BaseBottomDelegate中加載超燃。
fragment內(nèi)容頁面定義一個抽象類BottomItemDelegate,并實(shí)現(xiàn)IClickTabListener接口区拳。
在具體的fragment內(nèi)容頁面重寫IClickTabListener方法。
首先意乓,需要先定義一個接口IClickTabListener樱调,以供具體的子類實(shí)現(xiàn)方法:
public interface IClickTabListener {
/**
* 點(diǎn)擊tab返回頂部
*/
void onScrollToTop();
/**
* 判斷當(dāng)前頁面是否處于頂部
* @return 是否位于頂部
*/
boolean isTop();
/**
* 點(diǎn)擊tab刷新頁面
*/
void onRefresh();
}
然后,在抽象fragment內(nèi)容頁面BottomItemDelegate實(shí)現(xiàn)該接口:
public abstract class BottomItemDelegate extends PocketDelegate implements IClickTabListener
在具體的子類中重寫IClickTabListener的方法:
public class HomeItemDelegate extends BottomItemDelegate{
... ...
/**
* 重寫父類的onScrollToTop(),使scrollView滾動到頂部
*/
@Override
public void onScrollToTop() {
//設(shè)置toolbar的內(nèi)容自動滑出來
mAppbar.setExpanded(true);
//ScrollView滾動到頂部
mScrollView.smoothScrollTo(0,0);
}
/**
* 重寫父類的onRefresh()本涕,刷新當(dāng)前頁面
*/
@Override
public void onRefresh() {
//刷新樣式出現(xiàn)
mRefresh.setRefreshing(true);
//刷新內(nèi)容頁面
refreshNews();
}
@Override
public boolean isTop() {
//通過ScrollView.getScrollY()來判斷是否位于頂部
return mScrollView.getScrollY() == 0;
}
... ...
}
這里之所以使用Appbar.setExpanded(true)业汰,是因?yàn)樵谶@個頁面中我使用了CoordinatorLayout
+ AppBarLayout
+ V7.Toolbar
的嵌套結(jié)構(gòu),在頁面滾動的時候會自動隱藏toolbar
菩颖,因此样漆,會存在一個問題,如果不添加這行代碼晦闰,ScrollView
調(diào)用smoothScrollTo(0,0)
時toolbar
并不會顯示出來放祟,這里要感謝知乎@鄭大俊提出的方法,剩下的幾個方法注釋應(yīng)該能容易看得到呻右,就不多解釋了跪妥。
最后,在BaseBottomDelegate中的tab底部導(dǎo)航欄的點(diǎn)擊事件中實(shí)現(xiàn)如下代碼即可:
public abstract class BaseBottomDelegate extends PocketDelegate
implements View.OnClickListener{
... ...
@Override
public void onClick(View view) {
... ...
final int tag = (int) view.getTag();
BottomItemDelegate currentDelegate = ITEM_DELEGATE.get(mCurrentDelegate);
//如果已經(jīng)選中當(dāng)前頁面声滥,則再次點(diǎn)擊滾動到頂部眉撵。
if (tag == mCurrentDelegate) {
//如果已經(jīng)位于頂部,則刷新頁面
if (currentDelegate.isTop()){
currentDelegate.onRefresh();
return;
}
currentDelegate.onScrollToTop();
return;
}
... ...
//隱藏當(dāng)前fragment顯示點(diǎn)擊的fragment
getSupportDelegate().showHideFragment(ITEM_DELEGATE.get(tag), currentDelegate);
//重置tag為當(dāng)前所選中的fragment
mCurrentDelegate = tag;
}
... ...
}
這樣落塑,就實(shí)現(xiàn)了點(diǎn)擊底部導(dǎo)航欄按鈕實(shí)現(xiàn)返回頂部纽疟,再次點(diǎn)擊實(shí)現(xiàn)刷新的功能了!??