Android 中使用RecyclerView實(shí)現(xiàn)底部翻頁
RecyclerView 是Android L版本中新添加的一個(gè)用來取代ListView的SDK,它的靈活性與可替代性比listview更好。接下來通過一系列的文章講解如何使用RecyclerView,徹底拋棄ListView.
最近在做pad端的app,需要一個(gè)像網(wǎng)頁一樣效果,之前使用addView方式,頁碼少的時(shí)候還可以,能實(shí)現(xiàn)效果,但是碰到了一個(gè)1000多頁的界面,就GG了,頁碼半天顯示不出來,于是使用RecyclerView作為容器,主要是看中RecyclerView的復(fù)用,不說了,看代碼:
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) {
// 跳轉(zhuǎn)位置在第一個(gè)可見項(xiàng)之后,最后一個(gè)可見項(xiàng)之前
// smoothScrollToPosition根本不會(huì)動(dòng),此時(shí)調(diào)用smoothScrollBy來滑動(dòng)到指定位置
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;
}
}
調(diào)用:
直接在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"/>
代碼中調(diào)用:
初始化:
mBottomPagerView.setPageSize(AllPage);
回調(diào):
mBottomPagerView.setCurPage(new BottomPagerView.getCurPage() {
@Override public void serCurPage(int p) { //獲取點(diǎn)擊的頁碼數(shù),操作
}
});
總結(jié)
以上所述是小編給大家介紹的Android 中使用RecyclerView實(shí)現(xiàn)底部翻頁,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- android中圖片翻頁效果簡(jiǎn)單的實(shí)現(xiàn)方法
- 解析Android中實(shí)現(xiàn)滑動(dòng)翻頁之ViewFlipper的使用詳解
- Android實(shí)現(xiàn)閱讀APP平移翻頁效果
- android ViewPager實(shí)現(xiàn)滑動(dòng)翻頁效果實(shí)例代碼
- Android自定義左右或上下滑動(dòng)翻頁效果
- 基于Android實(shí)現(xiàn)3D翻頁效果
- Android?ViewPager實(shí)現(xiàn)左右滑動(dòng)翻頁效果
- Android利用懸浮按鈕實(shí)現(xiàn)翻頁效果
- Android 仿日歷翻頁、仿htc時(shí)鐘翻頁、數(shù)字翻頁切換效果
- Android通過手勢(shì)實(shí)現(xiàn)答題器翻頁效果
- RecyclerView+PagerSnapHelper實(shí)現(xiàn)抖音首頁翻頁的Viewpager效果
相關(guān)文章
Android實(shí)現(xiàn)自動(dòng)掛斷電話功能的示例代碼
在開發(fā)Android應(yīng)用時(shí),有時(shí)會(huì)遇到需要實(shí)現(xiàn)自動(dòng)掛斷電話的需求,本文將詳細(xì)介紹一下如何在Android中實(shí)現(xiàn)自動(dòng)掛斷電話的功能,需要的小伙伴可以參考一下2025-04-04
利用SurfaceView實(shí)現(xiàn)下雨與下雪動(dòng)畫效果詳解(Kotlin語法)
這篇文章主要給大家介紹了關(guān)于利用SurfaceView實(shí)現(xiàn)下雨與下雪動(dòng)畫效果的相關(guān)資料,需要一些基本的View知識(shí)和會(huì)一些基礎(chǔ)Kotlin語法,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
Android8.1原生系統(tǒng)網(wǎng)絡(luò)感嘆號(hào)消除的方法
這篇文章主要介紹了Android8.1原生系統(tǒng)網(wǎng)絡(luò)感嘆號(hào)消除的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05
Android開發(fā)實(shí)現(xiàn)AlertDialog中View的控件設(shè)置監(jiān)聽功能分析
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)AlertDialog中View的控件設(shè)置監(jiān)聽功能,結(jié)合實(shí)例形式分析了Android針對(duì)AlertDialog中的控件使用View進(jìn)行監(jiān)聽的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
android SQLite數(shù)據(jù)庫總結(jié)
本文主要介紹了android SQLite數(shù)據(jù)庫的相關(guān)知識(shí)。具有一定的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01
Android 中 TabHost與ViewPager結(jié)合實(shí)現(xiàn)首頁導(dǎo)航效果
這篇文章主要介紹了Android 中 TabHost與ViewPager結(jié)合實(shí)現(xiàn)首頁導(dǎo)航效果,代碼簡(jiǎn)單易懂,感興趣的朋友參考下吧2016-09-09
Kotlin 使用Lambda來設(shè)置回調(diào)的操作
這篇文章主要介紹了Kotlin 使用Lambda來設(shè)置回調(diào)的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03

