1. 程式人生 > >SwipeRefreshLayout+RecyclerView實現下拉重新整理上拉載入功能

SwipeRefreshLayout+RecyclerView實現下拉重新整理上拉載入功能

Android Studio 的gradle中新增如下依賴,SwipeRefreshLayout在 support V4 包下,RecyclerView在V7包下,由於V7包內包涵了V4,所以就不需要新增V4的依賴了。

  compile 'com.android.support:appcompat-v7:23.0.0'
  compile 'com.android.support:recyclerview-v7:23.0.0'

實現繼承自RecyclerView.Adapter<>的介面卡, 實現上拉載入功能,在RecyclerView的底部新增一個footer,(根據ViewType的型別判斷是新增Item還是Footer),需要重寫的三個方法:

①onCreateViewHolder()
這個方法主要為每個Item inflater出一個View,但是該方法返回的是一個ViewHolder。該方法把View直接封裝在ViewHolder中,然後我們面向的是ViewHolder這個例項,當然這個ViewHolder需要我們自己去編寫。直接省去了當初的convertView.setTag(holder)和convertView.getTag()這些繁瑣的步驟。

②onBindViewHolder()
這個方法主要用於適配渲染資料到View中。方法提供給你了一個viewHolder,而不是原來的convertView。

③getItemCount()
這個方法就類似於BaseAdapter的getCount方法了,即總共有多少個條目。

public class MyAdapter  extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    public enum LoadStatus{
        CLICK_LOAD_MORE,//上拉載入更多
        LOADING_MORE//正在載入更多
    }
    private LoadStatus mLoadStatus = LoadStatus.CLICK_LOAD_MORE;//上拉載入的狀態
private static final int VIEW_TYPE_FOOTER = 0; private static final int VIEW_TYPE_ITEM = 1; private List<String> mList; private Context mContext; public MyAdapter(Context context, List<String> list) { mContext = context; mList = list; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == VIEW_TYPE_FOOTER) { return onCreateFooterViewHolder(parent, viewType); } else if (viewType == VIEW_TYPE_ITEM) { return onCreateItemViewHolder(parent, viewType); } return null; } @Override public void onBindViewHolder(ViewHolder holder, int position) { switch (getItemViewType(position)) { case VIEW_TYPE_ITEM: onBindItemViewHolder(holder, position); break; case VIEW_TYPE_FOOTER: onBindFooterViewHolder(holder, position, mLoadStatus); break; default: break; } } public RecyclerView.ViewHolder onCreateFooterViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.footer_layout,parent,false); return new FooterViewHolder(view); } public RecyclerView.ViewHolder onCreateItemViewHolder(ViewGroup parent, int viewType) { View view =LayoutInflater.from(mContext).inflate(R.layout.item_layout,parent,false); return new ItemViewHolder(view); } public void onBindFooterViewHolder(RecyclerView.ViewHolder holder, int poition, LoadStatus loadStatus) { FooterViewHolder viewHolder = (FooterViewHolder) holder; switch (loadStatus) { case CLICK_LOAD_MORE: viewHolder.mLoadingLayout.setVisibility(View.GONE); viewHolder.mClickLoad.setVisibility(View.VISIBLE); break; case LOADING_MORE: viewHolder.mLoadingLayout.setVisibility(View.VISIBLE); viewHolder.mClickLoad.setVisibility(View.GONE); break; } } public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) { ItemViewHolder viewHolder = (ItemViewHolder) holder; viewHolder.mTextView.setText(getItem(position)); } @Override public int getItemCount() { return mList.size() + 1; } public void refresh(){ notifyDataSetChanged(); } public String getItem(int position) { return mList.get(position); } public void addAll(List<String> list) { this.mList.addAll(list); notifyDataSetChanged(); } @Override public int getItemViewType(int position) { if (position + 1 == getItemCount()) {//最後一條為FooterView return VIEW_TYPE_FOOTER; } return VIEW_TYPE_ITEM; } public void reSetData(List<String> list) { this.mList = list; notifyDataSetChanged(); } public void setLoadStatus(LoadStatus loadStatus) { this.mLoadStatus = loadStatus; } } class FooterViewHolder extends RecyclerView.ViewHolder{ public LinearLayout mLoadingLayout; public TextView mClickLoad; public FooterViewHolder(View itemView) { super(itemView); mLoadingLayout=(LinearLayout) itemView.findViewById(R.id.loading); mClickLoad=(TextView) itemView.findViewById(R.id.click_load_txt); /* mClickLoad.setOnClickListener(new View.OnClickListener() { //新增點選載入更多監聽 @Override public void onClick(View view) { loadMore(); } });*/ } } class ItemViewHolder extends RecyclerView.ViewHolder{ public TextView mTextView; public ItemViewHolder(View itemView) { super(itemView); mTextView = (TextView) itemView.findViewById(R.id.textView); } }

footer的layout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:gravity="center_horizontal"
    android:orientation="horizontal">

    <LinearLayout
        android:id="@+id/loading"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="horizontal">
        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="match_parent"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center_vertical"
            android:text="正在載入..."/>
    </LinearLayout>

    <TextView
        android:id="@+id/click_load_txt"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        android:text="點選載入更多"
        android:visibility="gone"/>

</RelativeLayout>

Item的layout

<?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">
<TextView
    android:gravity="center"
    android:id="@+id/textView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    />
</LinearLayout>

activity_main

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.yzppp.recycle.MainActivity">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipeRefreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </android.support.v7.widget.RecyclerView>

    </android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>

MainActivity的實現,下拉重新整理通過SwipeRefreshLayout.OnRefreshListener()
介面來實現。

public class MainActivity extends Activity {
private RecyclerView mRecyclerView;
private  SwipeRefreshLayout mSwipeRefreshLayout;
private MyAdapter mAdapter;
    private int mLastVisibleItemPosition=0;
    private LinearLayoutManager mLayoutManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRecyclerView= (RecyclerView) findViewById(R.id.recyclerView);
        mSwipeRefreshLayout= (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
        mLayoutManager=new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mAdapter=new MyAdapter(this,getData("init"));
        mRecyclerView.setAdapter(mAdapter);
        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener(){
                         @Override
                         public void onRefresh() {
                        new Thread(){
                          @Override
                          public void run() {
                              try{
                                Thread.sleep(3000);
                                final List<String> list=getData("refresh");
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        mAdapter.reSetData(list);
                                        mSwipeRefreshLayout.setRefreshing(false);
                                    }
                                });
                              }
                              catch (InterruptedException e){
                                  e.printStackTrace();
                              }
                          }
                      }.start();
                      }
             });

        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){
            @Override//滾動狀態變化時回撥
            public void onScrollStateChanged(RecyclerView recyclerView, int newState)    {

                super.onScrollStateChanged(recyclerView, newState);
               // mLastVisibleItemPosition=mLayoutManager.findLastVisibleItemPosition();
                //滑動停止並且底部不可滾動(即滑動到底部) 載入更多
                if(newState==RecyclerView.SCROLL_STATE_IDLE&&!(ViewCompat.canScrollVertically(recyclerView,1))
                       ){
                         loadMore();

                }
            }

            @Override//滾動時回撥
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);

            }
        });
   }

    public void loadMore(){
        mAdapter.setLoadStatus(MyAdapter.LoadStatus.LOADING_MORE);
        mAdapter.refresh();
        new Thread(){
            @Override
            public void run() {
                try{
                    Thread.sleep(3000);
                    final List<String> list=getData("load more");
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mAdapter.addAll(list);

                            mAdapter.setLoadStatus(MyAdapter.LoadStatus.CLICK_LOAD_MORE);
                        }
                    });
                }catch (InterruptedException e){
                  e.printStackTrace();
                };
            }
        }.start();
    }
    public  List<String> getData(String flag){
        int idx=1;
        if(mAdapter!=null){
            idx=mAdapter.getItemCount();
        }
        List<String> list=new ArrayList<>(10);
        for (int i=0;i<10;i++){
            list.add(flag+":"+(idx+i));
        }
        return list;
    }

}

相關推薦

使用SwipeRefreshLayoutRecyclerView實現重新整理載入更多

效果圖: 檔案目錄 佈局檔案 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/

SwipeRefreshLayout+RecyclerView實現重新整理載入功能

Android Studio 的gradle中新增如下依賴,SwipeRefreshLayout在 support V4 包下,RecyclerView在V7包下,由於V7包內包涵了V4,所以就不需要新增V4的依賴了。 compile 'com.and

SwipeRefreshLayout完美實現ListView網路資料載入以及重新整理

最近才有時間將上拉載入與下拉重新整理進行總結,SwipeRefreshLayout是Android -V4包下自帶的一個重新整理控制元件,但是不足的是它只有下拉重新整理的功能,沒有需要的上拉載入功能,所以我自己添加了上拉載入的功能。 一、首先簡單介紹一下SwipeRefre

自定義重新整理載入控制元件(SwipeRefreshLayout + recyclerView

感覺還可以的star下謝謝! 效果圖:(效果圖迴圈播放後,總感覺有些詭異!, 可能是gif截的點不對, 在手機上看效果正常的) 我就不講程式碼是如何實現的了。說下實現了什麼內容: 支援自動下拉重新整理 //設定自動下拉重新整理,切記要

react native自定義實現重新整理載入

1·定義元件 PageListView.js  /** * 上拉重新整理/下拉載入更多 元件 */ import React, { Component } from 'react'; import { Text, View, ListView, FlatList

vue-scroller的使用 實現重新整理 載入初始效果

安裝vue-scroller npm i vue-scroller -D 在main.js中: import VueScroller from 'vue-scroller' Vue.use(VueScroller) &nbs

MUI重新整理載入實現

DOM結構 <div id="refreshContainer" class="mui-content mui-scroll-wrapper"> <div class="hui-media-list mui-scroll"> <u

Android中ListView重新整理載入更多效果實現

  在Android開發中,下拉重新整理和上拉載入更多在很多app中都會有用到,下面就是具體的實現的方法。 首先,我們自定義一個RefreshListView來繼承與ListView,下面是程式碼: package com.example.downrefresh; import

banner實現無限輪播+重新整理載入+ 時 listview 和輪播圖一起重新整理

//首先把所需要的依賴包匯入  gson jar包、imageLoader jar包、banner1.4.9jar包、design jar包,,,然後匯入library,新建專案,把library匯入專案中 //新增許可權 <uses-permiss

Android ListView 實現重新整理載入

1.簡介        無疑,在Android開發中,ListView是使用非常頻繁的控制元件之一,ListView提供一個列表的容易,允許我們以列表的形式將資料展示到介面上,但是Google給我們提供的原生ListView的控制元件,雖然在功能上很強大,但是在使用

android 打造真正的重新整理載入recyclerview(三):重新整理載入

前言 在開發過程中,我想了兩種方案。一是使用LinearLayout巢狀頭部、recyclerview、尾部的方式,如下圖: 當recyclerview滑動到頂部時,移動LinearLayout露出頭部; 當recyclerview滑動到底

Android scrollview中巢狀listview實現listview的重新整理載入更多

我們都知道在Android中scrollview和listview都能滑動,如果scrollview巢狀listview會出現一些問題,比如listview不能正常顯示item...但是在一些專案中,一些頁面內容比較多,需要在外面放一個scrollview,裡面還會巢狀li

android 打造真正的重新整理載入recyclerview(一):使用

版本更新資訊 –V1.1.1 修復: PullToLoadRecyclerView中EmptyView失效的問題; 當使用ViewPager時,會出現觸控事件衝突; 優化: 當items不能填滿RecyclerView時,將隱藏載入底部; Pu

快速整合Android實現重新整理載入更多

本文實現一分鐘快速整合BGARefreshLayout下拉重新整理和上拉載入的功能. 這個是簡單單功能的整合方法,詳細BGARefreshLayout請到github中的demo,這只是我簡化版快速整合. 重要的程式碼實現如下: MainActivity類: pub

Android滑動衝突解決方式(重新整理載入更多,適配RecyclerView/ListView/ScrollView)

@Override public boolean judgeIntercept(float curInterceptY, float lastInterceptY, boolean isHeaderShow, boolean isFooterShow, boolean allowLoadM

安卓實現重新整理載入

前言 Android智慧下拉重新整理框架-SmartRefreshLayout 是github 上的一個開源框架,地址https://github.com/scwang90/SmartRefreshLayout 我做的幾個專案用的都是這個框架,挺好用的。

Android自定義控制元件實戰——實現仿IOS重新整理載入 PullToRefreshLayout

         下拉重新整理控制元件,網上有很多版本,有自定義Layout佈局的,也有封裝控制元件的,各種實現方式的都有。但是很少有人告訴你具體如何實現的,今天我們就來一步步實現自己封裝的 PullToRefreshLayout 完美的解決下拉重新整理,上拉載入問題。  

微信小程式 重新整理/載入更多 (載入更多怎麼實現

實現原理: 1、下拉重新整理:由於小程式資料是實時渲染的。我們把data{}內的資料清空重新載入即可實現下拉重新整理。 2、上拉載入更多(頁面上拉觸底事件):新獲取的資料追加到data{}內的原

完全自定義RecyclerView重新整理載入

自從谷歌推出SwipeRefreshLayout之後越來越多的部落格都是使用SwipeRefreshLayout來完成下拉重新整理,但是往往產品經理根本不會使用谷歌的樣式.每個公司都有一套自己的下拉樣式這個時候就需要我們完全自定義RecyclerView的下拉重新整理,基本

react-native-page-listview使用方法(自定義FlatList/ListView重新整理,載入更多,方便的實現分頁)

react-native-page-listview 對ListView/FlatList的封裝,可以很方便的分頁載入網路資料,還支援自定義下拉重新整理View和上拉載入更多的View.相容高版本FlatList和低版本ListVIew.元件會根據你使用的re