Android之RecyclerView轻松实现下拉刷新和加载更多示例

Android之RecyclerView轻松实现下拉刷新和加载更多示例,第1张

概述今天研究了下RecyclerView的滑动事件,特别是下拉刷新和加载更多事件,在现在几乎所有的APP显示数据列表时都用到了。自定义RecyclerView下拉刷新和加载更多听上去很复杂,实际上并不难,只要是对滑动事件的监听和处理

今天研究了下RecyclerVIEw的滑动事件,特别是下拉刷新和加载更多事件,在现在几乎所有的APP显示数据列表时都用到了。自定义RecyclerVIEw下拉刷新和加载更多听上去很复杂,实际上并不难,只要是对滑动事件的监听和处理。

一、自定义RecyclerVIEw实现下拉刷新和加载更多

1、如何判断RecyclerVIEw是在上滑还是下滑

在RecyclerVIEw的OnScrollListener滑动事件监听中有个好用的方法,就是onScrolled(RecyclerVIEw recyclerVIEw,int dx,int dy),其中根据dx的值的正负就可以判断是在左滑还是右滑,而根据dy的值就可以判断是在上滑还是下滑。

//上滑if(dy>0){//相应 *** 作代码}//下滑else if(dy<0){//相应 *** 作代码}

2、如何判断是否滑到了顶部或者底部

同样在RecyclerVIEw的OnScrollListener滑动事件监听中onScrolled(RecyclerVIEw recyclerVIEw,int dy)方法中处理,根据canScrollVertically(int direction)来进行判断。

//是否滑到底部if(!recyclerVIEw.canScrollVertically(1)){ //相应处理 *** 作}//是否滑到顶部if(!recyclerVIEw.canScrollVertically(-1)){ //相应处理 *** 作}

3、自定义RecyclerVIEw

知道了滑动事件的判断和处理,就可以很轻松得实现下拉刷新和加载更多了。

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;//是否可以加载更多标志 private Boolean isLoadEnd;//加载到最后的标志 private Boolean isLoadStart;//顶部的标志 private Boolean isRefresh;//是否可以下拉刷新标志 private int lastVisibleItem;//最后一项 private IOnScrollListener Listener;//事件监听 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 两种效果自己看着来    if (newState == RecyclerVIEw.SCRolL_STATE_IDLE) {     if (isLoadEnd) {      // 判断是否已加载所有数据      if (isLoadMore) {//未加载完所有数据,加载数据,并且还原isLoadEnd值为false,重新定位列表底部       if (getListener() != null) {        getListener().onLoadMore();       }      } else {//加载完了所有的数据       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 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;     }    }   }  }); } //监听事件 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; } //设置是否支持加载更多 public voID setLoadMoreEnable(Boolean loadMore) {  isLoadMore = loadMore; } public Boolean getRefresh() {  return isRefresh; } //设置是否支持下拉刷新 public voID setRefreshEnable(Boolean refresh) {  isRefresh = refresh; }}

二、实际用例

已经定义好了RecyclerVIEw,下面在Demo中实际使用和处理。

1、定义布局

布局文件很简单,就是一个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在这里就简单处理了,列表布局直接使用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中定义好控件以及数据加载 *** 作

实现自定义RecyclerVIEw中的数据加载事件监听,刷新、加载更多以及加载完成。

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); } /**  * 加载数据  */ 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();  } }}

三、最终效果图

到这里就轻松实现了RecyclerVIEw的下拉刷新和加载更多了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的Android之RecyclerView轻松实现下拉刷新和加载更多示例全部内容,希望文章能够帮你解决Android之RecyclerView轻松实现下拉刷新和加载更多示例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1147011.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存