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;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值