Android之RecyclerView輕松實(shí)現(xiàn)下拉刷新和加載更多示例

今天研究了下RecyclerView的滑動(dòng)事件,特別是下拉刷新和加載更多事件,在現(xiàn)在幾乎所有的APP顯示數(shù)據(jù)列表時(shí)都用到了。自定義RecyclerView下拉刷新和加載更多聽(tīng)上去很復(fù)雜,實(shí)際上并不難,只要是對(duì)滑動(dòng)事件的監(jiān)聽(tīng)和處理。

創(chuàng)新互聯(lián)建站于2013年開(kāi)始,先為濟(jì)水街道等服務(wù)建站,濟(jì)水街道等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為濟(jì)水街道企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

一、自定義RecyclerView實(shí)現(xiàn)下拉刷新和加載更多

1、如何判斷RecyclerView是在上滑還是下滑

在RecyclerView的OnScrollListener滑動(dòng)事件監(jiān)聽(tīng)中有個(gè)好用的方法,就是onScrolled(RecyclerView recyclerView, int dx, int dy),其中根據(jù)dx的值的正負(fù)就可以判斷是在左滑還是右滑,而根據(jù)dy的值就可以判斷是在上滑還是下滑。

//上滑
if(dy>0){
//相應(yīng)操作代碼
}
//下滑
else if(dy<0){
//相應(yīng)操作代碼
}

2、如何判斷是否滑到了頂部或者底部

同樣在RecyclerView的OnScrollListener滑動(dòng)事件監(jiān)聽(tīng)中onScrolled(RecyclerView recyclerView, int dx, int dy)方法中處理,根據(jù)canScrollVertically(int direction)來(lái)進(jìn)行判斷。

//是否滑到底部
if(!recyclerView.canScrollVertically(1)){
 //相應(yīng)處理操作
}
//是否滑到頂部
if(!recyclerView.canScrollVertically(-1)){
 //相應(yīng)處理操作
}

3、自定義RecyclerView

知道了滑動(dòng)事件的判斷和處理,就可以很輕松得實(shí)現(xiàn)下拉刷新和加載更多了。

import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;

/**
 * Package:com.liuting.library
 * author:liuting
 * Date:2017/2/14
 * Desc:自定義RecycleView,下拉刷新以及上拉加載更多
 */

public class RefreshLoadMoreRecycleView extends RecyclerView {
 private Boolean isLoadMore;//是否可以加載更多標(biāo)志
 private Boolean isLoadEnd;//加載到最后的標(biāo)志
 private Boolean isLoadStart;//頂部的標(biāo)志
 private Boolean isRefresh;//是否可以下拉刷新標(biāo)志
 private int lastVisibleItem;//最后一項(xiàng)
 private IOnScrollListener listener;//事件監(jiān)聽(tīng)

 public RefreshLoadMoreRecycleView(Context context) {
  super(context);
  init(context);
 }

 public RefreshLoadMoreRecycleView(Context context, @Nullable AttributeSet attrs) {
  super(context, attrs);
  init(context);
 }

 public RefreshLoadMoreRecycleView(Context context, @Nullable AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  init(context);
 }

 public void init(Context context) {
  isLoadEnd=false;
  isLoadStart =true;

  this.addOnScrollListener(new RecyclerView.OnScrollListener() {
   @Override
   public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    super.onScrollStateChanged(recyclerView, newState);
    //SCROLL_STATE_DRAGGING 和 SCROLL_STATE_IDLE 兩種效果自己看著來(lái)
    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
     if (isLoadEnd) {
      // 判斷是否已加載所有數(shù)據(jù)
      if (isLoadMore) {//未加載完所有數(shù)據(jù),加載數(shù)據(jù),并且還原isLoadEnd值為false,重新定位列表底部
       if (getListener() != null) {
        getListener().onLoadMore();
       }
      } else {//加載完了所有的數(shù)據(jù)
       if(getListener()!=null){
        getListener().onLoaded();
       }
      }
      isLoadEnd = false;
     } else if (isLoadStart) {
      if(isRefresh){
       if (getListener() != null) {
        getListener().onRefresh();
       }
       isLoadStart=false;
      }
     }

    }
   }

   @Override
   public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    super.onScrolled(recyclerView, dx, dy);
    //上滑
    if(dy>0){
     //是否滑到底部
     if(!recyclerView.canScrollVertically(1)){
      isLoadEnd = true;
     }else{
      isLoadEnd = false;
     }
    }
    //下滑
    else if(dy<0){
     //是否滑到頂部
     if(!recyclerView.canScrollVertically(-1)){
      isLoadStart=true;
     }else{
      isLoadStart=false;
     }
    }
   }
  });
 }

 //監(jiān)聽(tīng)事件
 public interface IOnScrollListener {
  void onRefresh();

  void onLoadMore();

  void onLoaded();
 }

 public IOnScrollListener getListener() {
  return listener;
 }

 public void setListener(IOnScrollListener listener) {
  this.listener = listener;
 }

 public Boolean getLoadMore() {
  return isLoadMore;
 }

 //設(shè)置是否支持加載更多
 public void setLoadMoreEnable(Boolean loadMore) {
  isLoadMore = loadMore;
 }

 public Boolean getRefresh() {
  return isRefresh;
 }

 //設(shè)置是否支持下拉刷新
 public void setRefreshEnable(Boolean refresh) {
  isRefresh = refresh;
 }
}

二、實(shí)際用例

已經(jīng)定義好了RecyclerView,下面在Demo中實(shí)際使用和處理。

1、定義布局

布局文件很簡(jiǎn)單,就是一個(gè)RecyclerView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/activity_main"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context="com.liuting.refreshloadmorelistview.MainActivity">

 <com.liuting.library.RefreshLoadMoreRecycleView
  android:id="@+id/main_recycle_view_data"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:scrollbars="none"
   />
</LinearLayout>

2、定義RecyclerView.Adapter

RecyclerView.Adapter在這里就簡(jiǎn)單處理了,列表布局直接使用Android自帶的。

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

/**
 * Package:com.liuting.refreshloadmorelistview.adapter
 * author:liuting
 * Date:2017/2/16
 * Desc:列表Adapter
 */

public class RefreshLoadMoreRecycleAdapter extends RecyclerView.Adapter<RefreshLoadMoreRecycleAdapter.ViewHolder> {
 private List<String> list;
 private Context context;

 public RefreshLoadMoreRecycleAdapter(Context context,List<String> list) {
  this.context =context;
  this.list = list;
 }

 @Override
 public RefreshLoadMoreRecycleAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_expandable_list_item_1, parent, false);
  RefreshLoadMoreRecycleAdapter.ViewHolder viewHolder = new RefreshLoadMoreRecycleAdapter.ViewHolder(view);
  return viewHolder;
 }

 @Override
 public void onBindViewHolder(ViewHolder holder, int position) {
  holder.text.setText(list.get(position));
  holder.itemView.setTag(position);
 }

 @Override
 public int getItemCount() {
  return list.size();
 }

 class ViewHolder extends RecyclerView.ViewHolder{
  private TextView text;

  public ViewHolder(View itemView) {
   super(itemView);
   text=(TextView)itemView.findViewById(android.R.id.text1);
  }
 }
}

3、在Activity中定義好控件以及數(shù)據(jù)加載操作

實(shí)現(xiàn)自定義RecyclerView中的數(shù)據(jù)加載事件監(jiān)聽(tīng),刷新、加載更多以及加載完成。

import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.widget.Toast;

import com.liuting.library.RefreshLoadMoreRecycleView;
import com.liuting.refreshloadmorelistview.adapter.RefreshLoadMoreRecycleAdapter;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements RefreshLoadMoreRecycleView.IOnScrollListener{
 private RefreshLoadMoreRecycleView recycleView;//下拉刷新RecycleView
 private List<String> list;//列表
 private RefreshLoadMoreRecycleAdapter adapter;//Adapter
 private ProgressDialog dialog;//提示框
 private static final int REFRESH_Load=0;//下拉刷新
 private static final int MORE_Load=1;//加載更多
 private Handler handler =new Handler(){
  @Override
  public void handleMessage(Message msg) {
   super.handleMessage(msg);
   switch (msg.what){
    case REFRESH_Load:
     recycleView.setLoadMoreEnable(true);
     dismissDialog();
     if(list!=null){
      list.clear();
     }
     loadData();
     adapter.notifyDataSetChanged();
     break;
    case MORE_Load:
     recycleView.setLoadMoreEnable(false);
     dismissDialog();
     loadData();
     adapter.notifyDataSetChanged();
     break;
   }
  }
 };

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  initView();
 }

 public void initView(){
  dialog = new ProgressDialog(MainActivity.this);

  list=new ArrayList<>();
  loadData();
  recycleView = (RefreshLoadMoreRecycleView)findViewById(R.id.main_recycle_view_data);

  final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this);
  recycleView.setLayoutManager(linearLayoutManager);
  adapter = new RefreshLoadMoreRecycleAdapter(MainActivity.this,list);
  recycleView.setAdapter(adapter);
  recycleView.setListener(this);
  recycleView.setRefreshEnable(true);
  recycleView.setLoadMoreEnable(true);
 }

 /**
  * 加載數(shù)據(jù)
  */
 public void loadData(){
  for(int i=0;i<10;i++ ){
   list.add("It is "+i);
  }
 }

 @Override
 public void onRefresh() {
  showDialog();
  new Thread(){
   @Override
   public void run() {
    super.run();
    try {
     sleep(5000);
     handler.sendEmptyMessage(REFRESH_Load);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }.start();
 }

 @Override
 public void onLoadMore() {
  showDialog();
  new Thread(){
   @Override
   public void run() {
    super.run();
    try {
     sleep(5000);
     handler.sendEmptyMessage(MORE_Load);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }.start();
 }

 @Override
 public void onLoaded() {
  Toast.makeText(MainActivity.this,"Loaded all",Toast.LENGTH_SHORT).show();
 }

 /**
  * dismiss dialog
  */
 private void dismissDialog(){
  if (dialog!=null&&dialog.isShowing()){
   dialog.dismiss();
  }
 }

 /**
  * show dialog
  */
 private void showDialog(){
  if (dialog!=null&&!dialog.isShowing()){
   dialog.show();
  }
 }
}

三、最終效果圖

Android之RecyclerView輕松實(shí)現(xiàn)下拉刷新和加載更多示例

到這里就輕松實(shí)現(xiàn)了RecyclerView的下拉刷新和加載更多了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

標(biāo)題名稱:Android之RecyclerView輕松實(shí)現(xiàn)下拉刷新和加載更多示例
網(wǎng)站地址:http://www.muchs.cn/article40/iidjho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、標(biāo)簽優(yōu)化、品牌網(wǎng)站設(shè)計(jì)、企業(yè)建站、企業(yè)網(wǎng)站制作、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)