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实现底部翻页,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

时间: 2024-10-14 09:25:40

Android 中使用RecyclerView实现底部翻页的相关文章

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

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

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

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

在Word 2010中使用“定位”功能快速翻页

当用户想要在一个比较长的Word 2010文档中快速定位到某个特定页时,可以借助Word 2010提供的"定位"功能实现快速翻页,操作步骤如下所述: 第1步,打开Word 2010长文档,在"开始"功能区的"编辑"分组中单击"查找"按钮右侧的下拉三角按钮,并单击"转到"命令,如图2010081219所示. 图2010081219 单击"转到"命令 第2步,打开"查找和替换&qu

在Word2010中使用“定位”功能快速翻页

  当用户想要在一个比较长的Word2010文档中快速定位到某个特定页时,可以借助Word2010提供的"定位"功能实现快速翻页,操作步骤如下所述: 第1步,打开Word2010长文档,在"开始"功能区的"编辑"分组中单击"查找"按钮右侧的下拉三角按钮,并单击"转到"命令,如图2010081219所示. 图2010081219 单击"转到"命令 第2步,打开"查找和替换&quo

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新组件初步上手指南

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

深入解析Android中的RecyclerView组件_Android

前些日子,组里为了在目前的Android程序里实现基于ListView子项的动画效果,希望将最新的RecyclerView引入到程序中,于是我便花了一些时间研究了一下RecyclerView的基本情况.本文算是对这些日子里了解的内容做一些汇总. 在网上关于RecyclerView的基本使用方式已经有了比较详细介绍,而且其设计结构也类似于ListView,所以本文将不重点介绍如何使用,在文末的引用中都可以相关内容.这里主要是介绍RecyclerView的基本功能.设计理念,以及系统提供API的情况

深入解析Android中的RecyclerView组件

前些日子,组里为了在目前的Android程序里实现基于ListView子项的动画效果,希望将最新的RecyclerView引入到程序中,于是我便花了一些时间研究了一下RecyclerView的基本情况.本文算是对这些日子里了解的内容做一些汇总. 在网上关于RecyclerView的基本使用方式已经有了比较详细介绍,而且其设计结构也类似于ListView,所以本文将不重点介绍如何使用,在文末的引用中都可以相关内容.这里主要是介绍RecyclerView的基本功能.设计理念,以及系统提供API的情况