Android中使用RecyclerView實現下拉重新整理和上拉載入_Android

來源:互聯網
上載者:User

推薦閱讀:使用RecyclerView添加Header和Footer的方法

                      RecyclerView的使用之HelloWorld

RecyclerView 是Android L版本中新添加的一個用來取代ListView的SDK,它的靈活性與可替代性比listview更好。本文給大家介紹如何為RecyclerView添加下拉重新整理和上拉載入,過去在ListView當中添加下拉重新整理和上拉載入是非常方便的利用addHeaderView和addFooterView,RecyclerView的重新整理同樣也是需要靠List當中添加Head或Foot來實現的。本篇不會詳細告訴你怎麼去做一個下拉重新整理和載入的效果,而是如何快速利用現有的知名開源庫來為RecyclerView實現下面的效果。

先給大家展示下效果圖,感興趣的朋友請繼續閱讀全文。

這個下拉重新整理不是靠List當中添加HeaderView來實現的,而是在RecyclerView外面套了一層ViewGroup而這個ViewGroup支援下拉重新整理,可以靈巧的實現一些子View的下拉重新整理,這個就是大名鼎鼎的android-Ultra-Pull-To-Refresh開源庫,作者liaohuqiu,但是很遺憾它不支援上拉載入,本篇用的是在這個庫基礎上進行了拓展並實現了上拉載入效果的開源庫,上拉的效果實現是靠RecyclerView裡添加FooterView,Github地址:https://github.com/Chanven/CommonPullToRefresh 感謝活躍在開源社區的開發人員們。

具體的實現步驟:(開發工具:Android Studio)

1:Gradle配置 build.gradle

//可選 或者在上面地址中下載library原始碼copy到項目裡面compile 'com.chanven.lib:cptr:1.0.0' // RecyclerView和CardViewcompile 'com.android.support:recyclerview-v7:23.1.1'compile 'com.android.support:cardview-v7:23.1.1'

2:主布局檔案 activity_main.xml 裡面一個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.PtrClassicFrameLayoutandroid: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.RecyclerViewandroid: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:清單項目布局 rv_item.xml 外面一個CardView的卡片式容器,裡面一個TextView

<?xml version="1.0" encoding="utf-8"?><android.support.v7.widget.CardViewxmlns: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"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid: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,持有每個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);}}//在該方法中我們建立一個ViewHolder並返回,ViewHolder必須有一個帶有View的建構函式,這個View就是我們Item的根布局,在這裡我們使用自訂Item的布局;@Overridepublic NormalViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {return new NormalViewHolder(mLayoutInflater.inflate(R.layout.rv_item,parent,false));}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {NormalViewHolder viewholder = (NormalViewHolder) holder;viewholder.mTextView.setText(mTitle.get(position));}//擷取資料的數量@Overridepublic int getItemCount() {return mTitle==null ? 0 : mTitle.size();}}

5:最重要的Activity的實現,MainActivity.java,代碼含義已經注釋

public class MainActivity extends AppCompatActivity {private RecyclerView mRecyclerView;//支援下拉重新整理的ViewGroupprivate PtrClassicFrameLayout mPtrFrame;//List資料private List<String> title = new ArrayList<>();//RecyclerView自訂Adapterprivate RvAdapter adapter;//添加Header和Footer的封裝類private RecyclerAdapterWithHF mAdapter;@Overrideprotected 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);//下拉重新整理支援時間mPtrFrame.setLastUpdateTimeRelateObject(this);//下拉重新整理一些設定 詳情參考文檔mPtrFrame.setResistance(1.7f);mPtrFrame.setRatioOfHeaderHeightToRefresh(1.2f);mPtrFrame.setDurationToClose(200);mPtrFrame.setDurationToCloseHeader(1000);// default is falsemPtrFrame.setPullToRefresh(false);// default is truemPtrFrame.setKeepHeaderWhenRefresh(true);//進入Activity就進行自動下拉重新整理mPtrFrame.postDelayed(new Runnable() {@Overridepublic void run() {mPtrFrame.autoRefresh();}}, 100);//下拉重新整理mPtrFrame.setPtrHandler(new PtrDefaultHandler() {@Overridepublic void onRefreshBegin(PtrFrameLayout frame) {title.clear();//類比資料for (int i = 0; i <= 5; i++) {title.add(String.valueOf(i));}//類比連網 延遲更新列表new Handler().postDelayed(new Runnable() {public void run() {mAdapter.notifyDataSetChanged();mPtrFrame.refreshComplete();mPtrFrame.setLoadMoreEnable(true);}}, 1000);}});//上拉載入mPtrFrame.setOnLoadMoreListener(new OnLoadMoreListener() {@Overridepublic void loadMore() {//類比連網延遲更新資料new Handler().postDelayed(new Runnable() {@Overridepublic void run() {//類比資料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);}});}}

以上內容是小編給大家介紹的Android中使用RecyclerView實現下拉重新整理和上拉載入教程,希望對大家有所協助!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.