Android 中使用RecyclerView实现底部翻页
时间:2022-07-28
本文章向大家介绍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实现底部翻页,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对ZaLou.Cn网站的支持!
- hbase源码系列(三)Client如何找到正确的Region Server
- hbase源码系列(五)Trie单词查找树
- 如何在特定的渗透测试中使用正确的Burp扩展插件
- hbase源码系列(十一)Put、Delete在服务端是如何处理?
- 大数据如何帮飞机节油?
- hbase源码系列(十二)Get、Scan在服务端是如何处理?
- OpenStack:建立虚拟的渗透测试实验环境 – 网络篇
- Kettle 添加对应hadoop版本的支持
- Layui常用方法
- 使用Identity Server 4建立Authorization Server (4)
- 使用Identity Server 4建立Authorization Server (3)
- 使用Identity Server 4建立Authorization Server (2)
- 使用Identity Server 4建立Authorization Server (1)
- Java之异常处理
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 萌新不看会后悔的C++string字符串常用知识点总结
- salesforce零基础学习(九十六)项目中的零碎知识点小总结(四)
- CodeForces - 260C
- 疯子的算法总结(九) 图论中的矩阵应用 Part 2 矩阵树 基尔霍夫矩阵定理 生成树计数 Matrix-Tree
- STL常用对象,不会搞得C++跟没学一样
- 桥接模式
- CF--思维练习--CodeForces - 220C Little Elephant and Shifts (STL模拟)
- CF--思维练习--CodeForces - 221C-H - Little Elephant and Problem (思维)
- CF--思维练习--CodeForces - 219C Color Stripe (思维)
- 疯子的算法总结(六) 简单排序总 选择排序+插入排序+比较排序+冒泡排序
- C语言基础知识总结
- CF思维联系--CodeForces - 218C E - Ice Skating (并查集)
- 数组及字符串相关知识
- C++循环结构
- C++条件分支结构