Android 中使用RecyclerView实现底部翻页

RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好。接下来通过一系列的文章讲解如何使用RecyclerView,彻底抛弃ListView.

最近在做pad端的app,需要一个像网页一样效果,之前使用addView方式,页码少的时候还可以,能实现效果,但是碰到了一个1000多页的界面,就GG了,页码半天显示不出来,于是使用RecyclerView作为容器,主要是看中RecyclerView的复用,不说了,看代码:

BottomPagerView xml布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal">
 <LinearLayout
 android:id="@+id/bottom_ll_content"
 android:layout_gravity="center_vertical"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:gravity="center_vertical"
 android:layout_marginLeft="10px"
 android:layout_marginRight="10px"
 android:layout_marginTop="10px"
 android:orientation="horizontal">
 <Button
  android:id="@+id/pre_page"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginRight="@dimen/y5"
  android:paddingBottom="@dimen/x4"
  android:paddingLeft="@dimen/y5"
  android:paddingRight="@dimen/y5"
  android:paddingTop="@dimen/x4"
  android:text="上一页"
  android:textSize="@dimen/middlesize"/>
 <android.support.v7.widget.RecyclerView
  android:id="@+id/recycler"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"/>
 <Button
  android:id="@+id/next_page"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginLeft="@dimen/y5"
  android:paddingBottom="@dimen/x4"
  android:paddingLeft="@dimen/y5"
  android:paddingRight="@dimen/y5"
  android:paddingTop="@dimen/x4"
  android:text="下一页"
  android:textSize="@dimen/middlesize"/>
 </LinearLayout>
</LinearLayout>

adapter的xml布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
 <RadioButton
 android:id="@+id/bottom_item_rb"
 android:layout_width="wrap_content"
 android:text="1"
 android:gravity="center_vertical"
 android:background="@drawable/tab_select"
 android:layout_height="wrap_content"/>
</LinearLayout>
BottomPagerView 代码:
public class BottomPagerView extends LinearLayout {
 private final LinearLayout ll_content;
 private int pageSize = 0;
 private Button pre_page;
 private Button next_page;
 private RecyclerView recycler;
 private BottomAdapter mBottomAdapter;
 Context mContent;
 private boolean mShouldScroll = false;
 private int mToPosition = 0;
 private int smoothWidth = 0;
 public BottomPagerView(Context context) {
 this(context, null);
 }
 public BottomPagerView(Context context, @Nullable AttributeSet attrs) {
 super(context, attrs);
 this.mContent = context;
 LayoutInflater.from(context).inflate(R.layout.bottom_page, this, true);
 ll_content = (LinearLayout) findViewById(R.id.bottom_ll_content);
 pre_page = (Button) findViewById(R.id.pre_page);
 next_page = (Button) findViewById(R.id.next_page);
 recycler = (RecyclerView) findViewById(R.id.recycler);
 /*initView(context);*/
 }
 public BottomPagerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
 this(context, attrs);
 }
 private int currentPage = 0;
 public void initView(final Context context) {
 if (pageSize == 0) {
  ll_content.setVisibility(INVISIBLE);
 } else {
  ll_content.setVisibility(VISIBLE);
  final List<BottomBean> list = new ArrayList<>();
  for (int i = 0; i < pageSize; i++) {
  BottomBean bean = new BottomBean();
  bean.setPosition(i);
  if (i == 0) {
   bean.setSelect(true);
  } else {
   bean.setSelect(false);
  }
  list.add(bean);
  }
  final LinearLayoutManager manager = new LinearLayoutManager(context);
  manager.setOrientation(LinearLayoutManager.HORIZONTAL);
  recycler.setLayoutManager(manager);
  int width = 0;
  if (pageSize > 8) {
  int pixelSize = getResources().getDimensionPixelSize(R.dimen.y6);
  width = pixelSize * 10;
  } else {
  width = LayoutParams.WRAP_CONTENT;
  }
  LayoutParams params = new LayoutParams(width, ViewGroup.LayoutParams.WRAP_CONTENT);
  recycler.setLayoutParams(params);
  mBottomAdapter = new BottomAdapter(context, list);
  recycler.setAdapter(mBottomAdapter);
  mBottomAdapter.setCurPage(new BottomAdapter.getCurPage() {
  @Override
  public void serCurPage(int p) {
   list.get(currentPage).setSelect(false);
   list.get(p).setSelect(true);
   mBottomAdapter.notifyDataSetChanged();
   currentPage = p;
   smoothMoveToPosition(recycler, p);
   recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
   @Override
   public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    super.onScrollStateChanged(recyclerView, newState);
    if (mShouldScroll){
    mShouldScroll = false;
    smoothMoveToPosition(recycler,mToPosition);
    }
   }
   });
   if (Curpage != null) {
   Curpage.serCurPage(p);
   }
  }
  });
  pre_page.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
   if (currentPage > 0) {
   int page = currentPage - 1;
   list.get(currentPage).setSelect(false);
   list.get(page).setSelect(true);
   currentPage = page;
   mBottomAdapter.notifyDataSetChanged();
   smoothMoveToPosition(recycler, page);
   recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    super.onScrollStateChanged(recyclerView, newState);
    if (mShouldScroll){
     mShouldScroll = false;
     smoothMoveToPosition(recycler,mToPosition);
    }
    }
   });
   if (Curpage != null) {
    Curpage.serCurPage(page);
   }
   } else {
   return;
   }
  }
  });
  next_page.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
   if (currentPage < pageSize - 1) {
   list.get(currentPage).setSelect(false);
   int page = currentPage + 1;
   Log.d("BottomPagerView", "onClick: " + page);
   list.get(page).setSelect(true);
   currentPage = page;
   mBottomAdapter.notifyDataSetChanged();
   smoothMoveToPosition(recycler, page);
   recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    super.onScrollStateChanged(recyclerView, newState);
    if (mShouldScroll){
     mShouldScroll = false;
     smoothMoveToPosition(recycler,mToPosition);
    }
    }
   });
   if (Curpage != null) {
    Curpage.serCurPage(page);
   }
   } else {
   return;
   }
  }
  });
 }
 }
 public void setPageSize(int size) {
 this.pageSize = size;
 initView(mContent);
 }
 private getCurPage Curpage;
 public interface getCurPage {
 void serCurPage(int p);
 }
 public void setCurPage(getCurPage page) {
 this.Curpage = page;
 }
 private void smoothMoveToPosition(RecyclerView mRecyclerView, final int position) {
 int firstItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(0));
 int lastItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(mRecyclerView.getChildCount()-1 ));
 Log.d("BottomPagerView", "smoothMoveToPosition: firstItem"+firstItem+" lastItem "+lastItem+" position"+position);
 if (position < firstItem) {
  mRecyclerView.smoothScrollToPosition(position);
  mShouldScroll = true;
  mToPosition = position;
 } else if (position <= lastItem) {
// 跳转位置在第一个可见项之后,最后一个可见项之前
// smoothScrollToPosition根本不会动,此时调用smoothScrollBy来滑动到指定位置
  int movePosition = position - firstItem;
  if (movePosition >= 0 && movePosition <= mRecyclerView.getChildCount()) {
  int top = mRecyclerView.getChildAt(movePosition).getLeft();
  int width = mRecyclerView.getMeasuredWidth() / 2;
  int scroll = top - width+mRecyclerView.getChildAt(movePosition).getMeasuredWidth()/2;
  Log.d("BottomPagerView", "smoothMove: "+scroll);
  mRecyclerView.smoothScrollBy(scroll, 0);
  }
 } else {
  mRecyclerView.smoothScrollToPosition(position);
  mShouldScroll = true;
  mToPosition = position;
 }
 }
}
BottomAdapter adapter:
public class BottomAdapter extends RecyclerView.Adapter<BottomAdapter.MyViewHolder> {
 Context mContext;
 List<BottomBean> size;
 private boolean isFirst = true;
 private int currentPage = 0;
 public BottomAdapter(Context context, List<BottomBean> size) {
 this.mContext = context;
 this.size = size;
 }
 @Override
 public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
 View view = View.inflate(mContext, R.layout.bottom_item, null);
 return new MyViewHolder(view);
 }
 @Override
 public void onBindViewHolder(final MyViewHolder holder, final int position) {
 holder.rb.setButtonDrawable(null);
 holder.rb.setText(position + 1 + "");
 holder.rb.setTag(position);
 holder.rb.setChecked(size.get(position).isSelect());
 holder.rb.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
  if (!size.get((int) holder.rb.getTag()).isSelect()){
   Curpage.serCurPage((int) holder.rb.getTag());
  }
  }
 });
 }
 @Override
 public int getItemCount() {
 return size.size();
 }
 class MyViewHolder extends RecyclerView.ViewHolder {
 private final RadioButton rb;
 public MyViewHolder(View itemView) {
  super(itemView);
  rb = (RadioButton) itemView.findViewById(R.id.bottom_item_rb);
 }
 }
 private getCurPage Curpage;
 public interface getCurPage {
 void serCurPage(int p);
 }
 public void setCurPage(getCurPage page) {
 this.Curpage = page;
 }
}

调用:

直接在xml中使用

<BottomPagerView
 android:id="@+id/part_part_tab"
 android:layout_width="wrap_content"
 android:layout_below="@+id/part_part_recycler"
 android:layout_height="wrap_content"
 android:layout_gravity="center_horizontal"
 android:layout_marginBottom="5dp"/>

代码中调用:

初始化:

mBottomPagerView.setPageSize(AllPage);

回调:

mBottomPagerView.setCurPage(new BottomPagerView.getCurPage() {
 @Override public void serCurPage(int p) { //获取点击的页码数,操作
 }
});

总结

以上所述是小编给大家介绍的Android 中使用RecyclerView实现底部翻页,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android中RecyclerView实现多级折叠列表效果(TreeRecyclerView)

    前言 首先不得不吐槽一下产品,尼玛为啥要搞这样的功能....搞个两级的不就好了嘛...自带控件,多好.三级,四级,听说还有六级的....这样丧心病狂的设计,后台也不好给数据吧. 先看看效果: 两级的效果: 三级的效果: 全部展开的效果(我只写了五级) 说说为什么写这货吧: 公司产品提出三级这个需求后,我就在网上找啊找. 找的第一个,发现实现其实是ExpandListview嵌套. 找的第二个,ExpandRecyclview,然后就用呗,发现三级展开很卡,看源码, 发现是RecyclerView

  • Android中RecyclerView实现分页滚动的方法详解

    一.需求分析 最近公司项目要实现一个需求要满足以下功能: 1)显示一个 list 列表, item 数量不固定. 2)实现翻页功能,一次翻一页. 3)实现翻至某一页功能. 下面介绍通过 RecyclerView 实现该需求的实现过程(效果图如下). 二.功能实现 2.1 OnTouchListener 记录当前开始滑动位置 要实现翻页滑动首先我们要确定是向前翻页还是向后翻页,这里通过记录开始翻页前当前的位置和滑动后的位置比较即可得知,下面选择手指触摸按下时滑动的位置为当前开始滑动位置: //当前

  • Android中RecyclerView 滑动时图片加载的优化

    RecyclerView 滑动时的优化处理,在滑动时停止加载图片,在滑动停止时开始加载图片,这里用了Glide.pause 和Glide.resume.这里为了避免重复设置增加开销,设置了一个标志变量来做判断. mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, in

  • Android利用RecyclerView实现全选、置顶和拖拽功能示例

    前言 今天给大家分享是如何在RecyclerView实现全选,ItemTouchHelper实现侧滑删除,拖拽功能.比较基础.关于RecyclerView的强大,就不多说了.在Android L SDK发布的新API中最有意思的就是RecyclerView 和 CardView了, 按照官方的说法, RecyclerView 一个ListView 的一个更高级更灵活的一个版本, 可以自定义的东西太多了. 效果: RecyclerView实现全选,ItemTouchHelper实现侧滑删除,拖拽功

  • RecyclerView滑动到指定Position的方法

    Question 最近在写 SideBar 的时候遇到一个问题,当执行 Recyclerview 的 smoothScrollToPosition(position) 的时候,Recyclerview 看上去并没有滚动到指定位置. Analysis 当然,这并不是方法的bug,而是 smoothScrollToPosition(position) 的执行效果有三种情况,需要区分. ·目标position在第一个可见项之前 . 这种情况调用smoothScrollToPosition能够平滑的滚动

  • Android RecyclerView的卡顿问题的解决方法

    RecyclerView为什么会卡 RecyclerView作为v7包的新控件,自从推出就广受Android Developer们欢迎,实际上它已经取代了ListView和GridView两位老前辈的地位.然而不少亲们想必也已经发现了:没有优化过的Recycler性能很poor.上一篇博主使用的item也仅仅是一个图两串字而已,结果一滑动就卡的要命,不能忍! 那么why?回想在用ListView和GridView的adapter时,我们是用一种叫ViewHolder的自定义类(容器)来实现优化的

  • Android中RecyclerView实现多级折叠列表效果(二)

    前言 在本文开始之前请大家先看一下这篇文章:http://www.jb51.net/article/113510.htm 上面的这篇文章是之前写的,里面发现有很多不好用地方,也学到些新姿势,改动了许多地方.下面来看看详细的介绍: 要点: 1.可以通过后台控制Item的展示. 2.TreeRecyclerAdapter,可以展开,折叠.多级展示 3.adapter可以使用装饰者模式进行扩展.支持EmptyAdapter.可以添加headview和footview 4.item的样式可以编写文档,t

  • 浅谈Android为RecyclerView增加监听以及数据混乱的小坑

    为 RecyclerView增加监听 1.在实现好的MyAdapter中写内部接口: public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) { this.onItemLongClickListener = onItemLongClickListener; } public void setOnItemClickListener(OnItemClickListener onIt

  • Android 中使用RecyclerView实现底部翻页

    RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好.接下来通过一系列的文章讲解如何使用RecyclerView,彻底抛弃ListView. 最近在做pad端的app,需要一个像网页一样效果,之前使用addView方式,页码少的时候还可以,能实现效果,但是碰到了一个1000多页的界面,就GG了,页码半天显示不出来,于是使用RecyclerView作为容器,主要是看中RecyclerView的复用,不说了,看代

  • vue 实现滚动到底部翻页效果(pc端)

    pc端vue 滚动到底部翻页 效果,具体内容如下所示: html: <div class="list" ref="scrollTopList"> <div class="listsmall" v-for="(item,index) of list" :key="index" @click="getDeviceInfo(item.id)"> <span cla

  • Android用viewPager2实现UI界面翻页滚动的效果

    1.先在build.gradle(Module)下添加引用viewPager2的库 implementation 'androidx.viewpager2:viewpager2:1.0.0' 2.在MainActivity下新建一个viewPager2 ViewPager2 viewPager = findViewById(R.id.viewPager); ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(); viewPager.

  • Android中使用RecyclerView实现下拉刷新和上拉加载

    推荐阅读:使用RecyclerView添加Header和Footer的方法                       RecyclerView的使用之HelloWorld RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好.本文给大家介绍如何为RecyclerView添加下拉刷新和上拉加载,过去在ListView当中添加下拉刷新和上拉加载是非常方便的利用addHeaderView和addFooterVie

  • Android自定义左右或上下滑动翻页效果

    本文实例为大家分享了Android自定义左右或上下滑动翻页展示的具体代码,供大家参考,具体内容如下 该自定义的效果和ViewPage+Fragment差不多 上下滑动翻页,继承ScrollView public class SlideScrollView extends ScrollView implements PageSlide{ private TotalSlide totalSlide; public SlideScrollView(AppCompatActivity context)

  • android中使用react-native设置应用启动页过程详解

    一.背景 在我们使用react-native进行编写代码的时候,当启动应用的时候,我们会看到如下界面 然而,这样的启动界面是非常的不又好,那么我们该怎么进行处理启动界面呢?有如下两种方案 二.方案 1.使用第三方库(react-native-splash-screen) 2.ios系统设置(仅适用ios系统,在这里不做讲解) 三.具体实现方式 一).react-native-splash-screen 1.安装 npm i react-native-splash-screen --save 2.

  • Android通过手势实现答题器翻页效果

    本文实例为大家分享了Android答题器翻页功能,主要使用ViewFilpper和GestureDetector来实现,供大家参考,具体内容如下 1.效果图 2.实现思路 把Activity的TouchEvent事件交个GestureDetector来处理,然后使用ViewFilpper使用动画控制多个组件的之间的切换效果.手势的一个Api就不详细说了,大家如果不了解可以查一下. 3.实现的步骤 1).构建手势检测器 2).准备数据 3).为ViewFilpper添加子控件. 4).初始化Ani

  • Android中对RecyclerView Adapter封装解析

    前言 关于adapter的封装,网上有很多开源库,开发的时候可以直接拿来用,省了很多事. 最近闲来无事,想着自己动手封装一个adapter. 问题 1.通常我们封装的时候,可以简化到这一步: BaseRecyclerViewAdapter adapter = new BaseRecyclerViewAdapter() { private static final int TYPE_FIR = 1; private static final int TYPE_SEC = 2; private st

  • Android中封装RecyclerView实现添加头部和底部示例代码

    前言 我们大家都知道ListView具有添加头部和添加底部的方法,但是RecyclerView并没有这样子的方法.所以RecyclerView是不能添加底部和头部的,但是能不能仿造ListView来实现RecyclerView添加头部和底部呢?答案当然是可行的.本文就来给大家介绍了关于Android封装RecyclerView添加头部和底部的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 首先看下实现的效果: 代码如下: public class WrapMyRecy

  • Android中的RecyclerView新组件初步上手指南

    介绍 RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用户只要实现自己的viewholder就可以了,该组件会自动帮你回收复用每一个item. 它不但变得更精简,也变得更加容易使用,而且更容易组合设计出自己需要的滑动布局. RecyclerView与ListView原理是类似的:都是仅仅维护少量的View并且可以展示大量的数据集.RecyclerView用

随机推荐