RecycleView + SwipeRefreshLayout 实现下拉刷新和底部自动加载

前段时间项目里面使用了RecycleView 但是里面的刷新和加载都是框架里面封装好的,直接使用

这几天比较闲就自己来实现以下.

因为SwipeRefreshLayout是一个下拉刷新控件所有直接和RecycleView结合使用就行了

布局文件

<?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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="tianliang.com.mvpdemo.MainActivity">
    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/SwipeRefreshLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/RecyclerView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </android.support.v7.widget.RecyclerView>
    </android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>

 主代码

在里面使用了 butterknife 关联控件

public class MainActivity extends AppCompatActivity {

    @Nullable
    @BindView(R.id.RecyclerView)
    RecyclerView mRecyclerView;
    @Nullable
    @BindView(R.id.SwipeRefreshLayout)
    SwipeRefreshLayout mSwipeRefreshLayout;

    private LinearLayoutManager mLayoutManager;
    private List<String> data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        initData();
    }

    private void initData() {
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);
        //初始化数据
        data = new ArrayList<>();
        for (int i = 1; i < 30; i++) {
            data.add("数据+" + i);
        }
        RecyclerViewAdapter mAdapter = new RecyclerViewAdapter(data);//设置adpater
        mRecyclerView.setAdapter(mAdapter);
    //SwipeRefreshLayout监听 mSwipeRefreshLayout.setOnRefreshListener(
new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() {//模仿加载网络数据 new Handler().postDelayed(new Runnable() { @Override public void run() {//每次刷新一条数据 data.add(0, "刷新出来的数据"); mRecyclerView.getAdapter().notifyDataSetChanged(); mSwipeRefreshLayout.setRefreshing(false); } }, 2000); } });
    mRecyclerView.setOnScrollListener(new OnRcvScrollListener(){//使用自定义的RecycleView的底部监听
     @Override
     public void onBottom() {//接口回调
     new Handler().postDelayed(new Runnable() {//模仿网络请求
     @Override
      public void run() {
     if (data.size() <= 50) {
   for (int i = 1; i < 5; i++) {
   data.add("加载更多+" + i);
   }
   }
   mRecyclerView.getAdapter().notifyDataSetChanged();//刷新adapter
   }
   }, 2000);
   }
  }
);
 
  } 
}
RecycleView的底部监听
使用的是  http://www.cnblogs.com/tianzhijiexian/p/4397552.html 写好的工具类
public abstract class OnRcvScrollListener extends RecyclerView.OnScrollListener implements OnBottomListener {

    private String TAG = getClass().getSimpleName();

    public static enum LAYOUT_MANAGER_TYPE {
        LINEAR,
        GRID,
        STAGGERED_GRID
    }

    /**
     * layoutManager的类型(枚举)
     */
    protected LAYOUT_MANAGER_TYPE layoutManagerType;

    /**
     * 最后一个的位置
     */
    private int[] lastPositions;

    /**
     * 最后一个可见的item的位置
     */
    private int lastVisibleItemPosition;
/*    *//**
     * 是否正在加载
     *//*
    private boolean isLoadingMore = false;*/

    /**
     * 当前滑动的状态
     */
    private int currentScrollState = 0;

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
        //  int lastVisibleItemPosition = -1;
        if (layoutManagerType == null) {
            if (layoutManager instanceof LinearLayoutManager) {
                layoutManagerType = LAYOUT_MANAGER_TYPE.LINEAR;
            } else if (layoutManager instanceof GridLayoutManager) {
                layoutManagerType = LAYOUT_MANAGER_TYPE.GRID;
            } else if (layoutManager instanceof StaggeredGridLayoutManager) {
                layoutManagerType = LAYOUT_MANAGER_TYPE.STAGGERED_GRID;
            } else {
                throw new RuntimeException(
                        "Unsupported LayoutManager used. Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager");
            }
        }

        switch (layoutManagerType) {
            case LINEAR:
                lastVisibleItemPosition = ((LinearLayoutManager) layoutManager)
                        .findLastVisibleItemPosition();
                break;
            case GRID:
                lastVisibleItemPosition = ((GridLayoutManager) layoutManager)
                        .findLastVisibleItemPosition();
                break;
            case STAGGERED_GRID:
                StaggeredGridLayoutManager staggeredGridLayoutManager
                        = (StaggeredGridLayoutManager) layoutManager;
                if (lastPositions == null) {
                    lastPositions = new int[staggeredGridLayoutManager.getSpanCount()];
                }
                staggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions);
                lastVisibleItemPosition = findMax(lastPositions);
                break;
        }

    }

    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        currentScrollState = newState;
        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
        int visibleItemCount = layoutManager.getChildCount();
        int totalItemCount = layoutManager.getItemCount();
        if ((visibleItemCount > 0 && currentScrollState == RecyclerView.SCROLL_STATE_IDLE &&
                (lastVisibleItemPosition) >= totalItemCount - 1)) {
            onBottom();
        }
    }


    @Override
    public abstract void onBottom() ;

    private int findMax(int[] lastPositions) {
        int max = lastPositions[0];
        for (int value : lastPositions) {
            if (value > max) {
                max = value;
            }
        }
        return max;
    }
}

回调接口

public interface OnBottomListener {
    void onBottom();
}

apdater

根据条目是否是最后一条来显示对应的hoder

public class RecyclerViewAdapter extends RecyclerView.Adapter {
    private final List<String> mData;
    private int TYPE_FOOTER = 1;//加载更多
    private int TYPE_NORMAL = 0;//itme

    public RecyclerViewAdapter(List<String> data) {
        mData = data;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_FOOTER) {//加载更多
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapet, parent, false);
            footerHodler footer = new footerHodler(view,mData);
            return footer;
        }
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.itmeadapet, parent, false);
        itmeHoder hoder = new itmeHoder(view, mData.get(viewType));
        return hoder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (getItemViewType(position) == TYPE_NORMAL && holder instanceof itmeHoder) {
            ((itmeHoder) holder).setData(mData.get(position));
        }else if (getItemViewType(position) == TYPE_FOOTER && holder instanceof footerHodler){
            ((footerHodler)holder).setData();
        }
    }

    @Override
    public int getItemCount() {
        return mData.size() + 1;
    }

    @Override
    public int getItemViewType(int position) {
        if (position == getItemCount() - 1) {
            return TYPE_FOOTER;//最后一条数据
        }
        return TYPE_NORMAL;
    }
}

ok,大体就是这样了

 

转载于:https://www.cnblogs.com/wuwenweihe/p/7230383.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值