Android中使用RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載
推薦閱讀:使用RecyclerView添加Header和Footer的方法
RecyclerView 是Android L版本中新添加的一個(gè)用來(lái)取代ListView的SDK,它的靈活性與可替代性比listview更好。本文給大家介紹如何為RecyclerView添加下拉刷新和上拉加載,過(guò)去在ListView當(dāng)中添加下拉刷新和上拉加載是非常方便的利用addHeaderView和addFooterView,RecyclerView的刷新同樣也是需要靠List當(dāng)中添加Head或Foot來(lái)實(shí)現(xiàn)的。本篇不會(huì)詳細(xì)告訴你怎么去做一個(gè)下拉刷新和加載的效果,而是如何快速利用現(xiàn)有的知名開(kāi)源庫(kù)來(lái)為RecyclerView實(shí)現(xiàn)下面的效果。
先給大家展示下效果圖,感興趣的朋友請(qǐng)繼續(xù)閱讀全文。
這個(gè)下拉刷新不是靠List當(dāng)中添加HeaderView來(lái)實(shí)現(xiàn)的,而是在RecyclerView外面套了一層ViewGroup而這個(gè)ViewGroup支持下拉刷新,可以靈巧的實(shí)現(xiàn)一些子View的下拉刷新,這個(gè)就是大名鼎鼎的android-Ultra-Pull-To-Refresh開(kāi)源庫(kù),作者liaohuqiu,但是很遺憾它不支持上拉加載,本篇用的是在這個(gè)庫(kù)基礎(chǔ)上進(jìn)行了拓展并實(shí)現(xiàn)了上拉加載效果的開(kāi)源庫(kù),上拉的效果實(shí)現(xiàn)是靠RecyclerView里添加FooterView,Github地址:https://github.com/Chanven/CommonPullToRefresh 感謝活躍在開(kāi)源社區(qū)的開(kāi)發(fā)者們。
具體的實(shí)現(xiàn)步驟:(開(kāi)發(fā)工具:Android Studio)
1:Gradle配置 build.gradle
//可選 或者在上面地址中下載library源代碼copy到項(xiàng)目里面 compile 'com.chanven.lib:cptr:1.0.0' // RecyclerView和CardView compile 'com.android.support:recyclerview-v7:23.1.1' compile 'com.android.support:cardview-v7:23.1.1'
2:主布局文件 activity_main.xml 里面一個(gè)RecyclerView 外面嵌套的是支持下拉刷新的ViewGroup
<?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="match_parent"> <com.chanven.lib.cptr.PtrClassicFrameLayout android:id="@+id/rotate_header_list_view_frame" xmlns:cube_ptr="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#e1e1e1" cube_ptr:ptr_duration_to_close="200" cube_ptr:ptr_duration_to_close_header="1000" cube_ptr:ptr_keep_header_when_refresh="true" cube_ptr:ptr_pull_to_fresh="false" cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2" cube_ptr:ptr_resistance="1.7"> <android.support.v7.widget.RecyclerView android:background="#ffffff" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/rv_list" /> </com.chanven.lib.cptr.PtrClassicFrameLayout> </LinearLayout>
3:列表項(xiàng)布局 rv_item.xml 外面一個(gè)CardView的卡片式容器,里面一個(gè)TextView
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="8dp" android:id="@+id/cv_item" android:foreground="?android:attr/selectableItemBackground" card_view:cardCornerRadius="4dp" card_view:cardElevation="4dp" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_item_text" android:text="test" android:layout_margin="8dp" /> </LinearLayout> </android.support.v7.widget.CardView>
4:RecyclerView的Adapter RvAdapter.java
public class RvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private LayoutInflater mLayoutInflater; private Context mContext; private List <String> mTitle; public RvAdapter(Context context,List<String> title){ mContext=context; mTitle=title; mLayoutInflater=LayoutInflater.from(context); } //自定義的ViewHolder,持有每個(gè)Item的的所有界面元素 public static class NormalViewHolder extends RecyclerView.ViewHolder { TextView mTextView; CardView mCardView; public NormalViewHolder(View itemView) { super(itemView); mTextView=(TextView)itemView.findViewById(R.id.tv_item_text); mCardView=(CardView)itemView.findViewById(R.id.cv_item); } } //在該方法中我們創(chuàng)建一個(gè)ViewHolder并返回,ViewHolder必須有一個(gè)帶有View的構(gòu)造函數(shù),這個(gè)View就是我們Item的根布局,在這里我們使用自定義Item的布局; @Override public NormalViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new NormalViewHolder(mLayoutInflater.inflate(R.layout.rv_item,parent,false)); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { NormalViewHolder viewholder = (NormalViewHolder) holder; viewholder.mTextView.setText(mTitle.get(position)); } //獲取數(shù)據(jù)的數(shù)量 @Override public int getItemCount() { return mTitle==null ? 0 : mTitle.size(); } }
5:最重要的Activity的實(shí)現(xiàn),MainActivity.java,代碼含義已經(jīng)注釋
public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; //支持下拉刷新的ViewGroup private PtrClassicFrameLayout mPtrFrame; //List數(shù)據(jù) private List<String> title = new ArrayList<>(); //RecyclerView自定義Adapter private RvAdapter adapter; //添加Header和Footer的封裝類(lèi) private RecyclerAdapterWithHF mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRecyclerView = (RecyclerView) findViewById(R.id.rv_list); LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); mRecyclerView.setLayoutManager(layoutManager); adapter = new RvAdapter(MainActivity.this, title); mAdapter = new RecyclerAdapterWithHF(adapter); mRecyclerView.setAdapter(mAdapter); mPtrFrame = (PtrClassicFrameLayout) findViewById(R.id.rotate_header_list_view_frame); //下拉刷新支持時(shí)間 mPtrFrame.setLastUpdateTimeRelateObject(this); //下拉刷新一些設(shè)置 詳情參考文檔 mPtrFrame.setResistance(1.7f); mPtrFrame.setRatioOfHeaderHeightToRefresh(1.2f); mPtrFrame.setDurationToClose(200); mPtrFrame.setDurationToCloseHeader(1000); // default is false mPtrFrame.setPullToRefresh(false); // default is true mPtrFrame.setKeepHeaderWhenRefresh(true); //進(jìn)入Activity就進(jìn)行自動(dòng)下拉刷新 mPtrFrame.postDelayed(new Runnable() { @Override public void run() { mPtrFrame.autoRefresh(); } }, 100); //下拉刷新 mPtrFrame.setPtrHandler(new PtrDefaultHandler() { @Override public void onRefreshBegin(PtrFrameLayout frame) { title.clear(); //模擬數(shù)據(jù) for (int i = 0; i <= 5; i++) { title.add(String.valueOf(i)); } //模擬聯(lián)網(wǎng) 延遲更新列表 new Handler().postDelayed(new Runnable() { public void run() { mAdapter.notifyDataSetChanged(); mPtrFrame.refreshComplete(); mPtrFrame.setLoadMoreEnable(true); } }, 1000); } }); //上拉加載 mPtrFrame.setOnLoadMoreListener(new OnLoadMoreListener() { @Override public void loadMore() { //模擬聯(lián)網(wǎng)延遲更新數(shù)據(jù) new Handler().postDelayed(new Runnable() { @Override public void run() { //模擬數(shù)據(jù) for (int i = 0; i <= 5; i++) { title.add(String.valueOf(i)); } mAdapter.notifyDataSetChanged(); mPtrFrame.loadMoreComplete(true); Toast.makeText(MainActivity.this, "load more complete", Toast.LENGTH_SHORT) .show(); } }, 1000); } }); } }
以上內(nèi)容是小編給大家介紹的Android中使用RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載教程,希望對(duì)大家有所幫助!
- Android RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載
- Android RecyclerView 上拉加載更多及下拉刷新功能的實(shí)現(xiàn)方法
- 詳解Recyclerview item中有EditText使用刷新遇到的坑
- Android使用recyclerview打造真正的下拉刷新上拉加載效果
- android RecyclerView側(cè)滑菜單,滑動(dòng)刪除,長(zhǎng)按拖拽,下拉刷新上拉加載
- XRecyclerView實(shí)現(xiàn)下拉刷新、滾動(dòng)到底部加載更多等功能
- Android使用RecyclerView實(shí)現(xiàn)自定義列表、點(diǎn)擊事件以及下拉刷新
- Android RecyclerView的刷新分頁(yè)的實(shí)現(xiàn)
- Android RecyclerView下拉刷新和上拉加載更多
- RecyclerView使用payload實(shí)現(xiàn)局部刷新
相關(guān)文章
Android開(kāi)發(fā)之imageView圖片按比例縮放的實(shí)現(xiàn)方法
這篇文章主要介紹了Android開(kāi)發(fā)之imageView圖片按比例縮放的實(shí)現(xiàn)方法,較為詳細(xì)的分析了Android中ImageView控件的scaleType屬性控制圖片縮放的具體用法,需要的朋友可以參考下2016-01-01android studio 新手入門(mén)教程(二)項(xiàng)目的導(dǎo)入教程圖解
這篇文章主要介紹了android studio 新手入門(mén)教程(二)項(xiàng)目的導(dǎo)入教程圖解,需要的朋友可以參考下2017-12-12圖解Windows環(huán)境下Android Studio安裝和使用教程
這篇文章主要介紹了圖解Windows環(huán)境下Android Studio安裝和使用教程的相關(guān)資料,需要的朋友可以參考下2015-12-12Kotlin中?和!!的區(qū)別詳細(xì)對(duì)比
這篇文章主要給大家介紹了關(guān)于Kotlin中?和!!區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05android studio 3.6.1升級(jí)后如何處理 flutter問(wèn)題
這篇文章主要介紹了android-studio-3.6.1升級(jí)后 flutter問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03android中Fragment+RadioButton實(shí)現(xiàn)底部導(dǎo)航欄
本篇文章主要介紹了android中Fragment+RadioButton實(shí)現(xiàn)底部導(dǎo)航欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03Android中Volley框架進(jìn)行請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)的使用
這篇文章主要介紹了Android中Volley框架進(jìn)行請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)的使用,本文給大家介紹的非常詳細(xì)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10