今天研究了下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轻松实现下拉刷新和加载更多示例所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)