安卓实现点击底部导航栏返回顶部&刷新功能

现在的app几乎都是伴随着底部导航栏,
页面往往存在着ScrollView或者RecyclerView等可滑动的ViewGroup,
因此刷新返回顶部的功能是必备的,
通过点击底部导航栏返回顶部刷新显然是最合适的,


先说明一下项目结构:

底部导航栏切换fragment的实现就是FrameLayout+tab,并在BaseBottomDelegate中加载。

fragment内容页面定义一个抽象类BottomItemDelegate,并实现IClickTabListener接口。

在具体的fragment内容页面重写IClickTabListener方法。


首先,需要先定义一个接口IClickTabListener,以供具体的子类实现方法:

public interface IClickTabListener {

  /**
  * 点击tab返回顶部
  */
  void onScrollToTop();

  /**
   * 判断当前页面是否处于顶部
   * @return 是否位于顶部
   */
  boolean isTop();

   /**
   * 点击tab刷新页面
   */
  void onRefresh();
}

然后,在抽象fragment内容页面BottomItemDelegate实现该接口:

public abstract class BottomItemDelegate extends PocketDelegate implements IClickTabListener

在具体的子类中重写IClickTabListener的方法:

public class HomeItemDelegate extends BottomItemDelegate{
  ... ...
   /**
   * 重写父类的onScrollToTop(),使scrollView滚动到顶部
   */
  @Override
  public void onScrollToTop() {
    //设置toolbar的内容自动滑出来
    mAppbar.setExpanded(true);
    //ScrollView滚动到顶部
    mScrollView.smoothScrollTo(0,0);
  }

  /**
   * 重写父类的onRefresh(),刷新当前页面
   */
  @Override
  public void onRefresh() {
    //刷新样式出现
    mRefresh.setRefreshing(true);
    //刷新内容页面
    refreshNews();
  }

  @Override
  public boolean isTop() {
    //通过ScrollView.getScrollY()来判断是否位于顶部
    return mScrollView.getScrollY() == 0;
  }
  ... ...
}

这里之所以使用Appbar.setExpanded(true),是因为在这个页面中我使用了CoordinatorLayout + AppBarLayout + V7.Toolbar 的嵌套结构,在页面滚动的时候会自动隐藏toolbar,因此,会存在一个问题,如果不添加这行代码,ScrollView调用smoothScrollTo(0,0)toolbar并不会显示出来,这里要感谢知乎@郑大俊提出的方法,剩下的几个方法注释应该能容易看得到,就不多解释了。

最后,在BaseBottomDelegate中的tab底部导航栏的点击事件中实现如下代码即可:

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);
    //如果已经选中当前页面,则再次点击滚动到顶部。
    if (tag == mCurrentDelegate) {
        //如果已经位于顶部,则刷新页面
        if (currentDelegate.isTop()){
            currentDelegate.onRefresh();
            return;
        }
        currentDelegate.onScrollToTop();
        return;
    }
    ... ...
    //隐藏当前fragment显示点击的fragment
    getSupportDelegate().showHideFragment(ITEM_DELEGATE.get(tag), currentDelegate);
    //重置tag为当前所选中的fragment
    mCurrentDelegate = tag;
  }
  ... ...
}

这样,就实现了点击底部导航栏按钮实现返回顶部,再次点击实现刷新的功能了!😄

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。