mvp下RecyclerView下拉刷新上拉加载Demo

直接上代码,代码中注释详细,可直接观察


Model接口采用泛型,方便复用

    void setData(List<T> list);
    List<T> getData();
    void deleteData(int position);
    void addOne(int index,T t);//index为数据插入位置

model实现类比较简单不进行展示


Presenter类

    //view接口对象
    private IDemoView view;
    //model接口对象
    private IBiz data;
    private List<DemoModel> modelList;

    //模拟上拉可加载次数为3次
    private int index = 2;

下拉上拉核心操作

 public void addOne() {
        //模拟下拉操作,回调显示在主线程,实际可根据网络配置
        Observable
                .timer(2, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        DemoModel demoModel = new DemoModel();
                        demoModel.setText("down item");
                        data.addOne(0, demoModel);
                        //view改变
                        view.addFinish();
                    }
                });
    }

    public void addMore() {
        //模拟上拉操作,回调显示在主线程,实际可根据网络配置
        Observable
                .timer(2, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        if (index >= 0) {
                                DemoModel demoModel = new DemoModel();
                                demoModel.setText("up item" + index);
                                data.addOne(data.getData().size(), demoModel);
                            --index;
                            //view改变
                            view.addMoreFinish("上拉加载更多成功");
                        } else {
                            view.addMoreFinish("暂时没有新数据");
                        }
                    }
                });
    }

View 接口

    void getData();

    void setData();

    void addOne();

    void deletaData(int position);//demo中加入左滑删除功能,读者可自行下载demo研究

    void addFinish();

    void addMore();

    void addMoreFinish(String notice);

View实现类

部分成员变量

    //MVP-P
    private DemoPresenter demoPresenter;

    //数据源
    private List<DemoModel> mList;
    //recycler布局管理器
    private LinearLayoutManager linearLayoutManager;
    //适配器
    private DemoAdapter mAdapter;

    //当前可见最后项
    private int lastVisibleItem;

    //判断上滑还是下拉
    private static int ADD_FLAG = 0;
    private static int ADD_HEAD = 0;
    private static int ADD_BOTTOM = 1;


监听事件:
 swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                addOne();//下拉刷新
            }
        });
        recycler.setOnItemListener(new ItemRemoveRecyclerView.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                System.out.println("click item" + position);//item点击事件
            }

            @Override
            public void onDeleteClick(int position) {//item左滑删除按钮事件
                deletaData(position);
                mAdapter.notifyItemRemoved(position);
                mAdapter.notifyItemRangeChanged(0, mList.size());
            }
        });
        recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                boolean isSignificantDelta = Math.abs(dy) > 10;//滑动幅度限制
                lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
                if (isSignificantDelta) {
                    if (dy > 0) {//判断上下滑
                        ADD_FLAG = ADD_BOTTOM;
                    } else {
                        ADD_FLAG = ADD_HEAD;
                    }
                }
            }

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == mAdapter.getItemCount() && ADD_FLAG == ADD_BOTTOM) {
                    addMore();//上拉加载更多
                }
            }
        });


回调实现:
   //下拉刷新回调
    @Override
    public void addFinish() {
        mAdapter.notifyDataSetChanged();
        swipeRefreshLayout.setRefreshing(false);
        Toast.makeText(this, "下拉刷新成功", Toast.LENGTH_SHORT).show();
    }


    //上拉加载回调
    @Override
    public void addMoreFinish(String notice) {
        mAdapter.notifyDataSetChanged();
        mAdapter.changeMoreStatus(DemoAdapter.PULLUP_LOAD_MORE);
        Toast.makeText(this, notice, Toast.LENGTH_SHORT).show();
    }


Adapter类实现

部分成员变量:

    private static final int TYPE_ITEM = 0;  //普通Item View
    private static final int TYPE_FOOTER = 1;//底部footview
    public static final int PULLUP_LOAD_MORE = 0;
    //正在加载中
    public static final int LOADING_MORE = 1;
    //上拉加载更多状态-默认为0
    private int load_more_status = 0;


item选择不同的type

<span style="white-space:pre">	</span>//判断类型选择不同item布局
        if (holder instanceof ViewHolder) {
            ((ViewHolder) holder).content.setText(mList.get(position).getText());
            holder.itemView.setTag(position);
        } else if (holder instanceof FootViewHolder) {
            FootViewHolder footViewHolder = (FootViewHolder) holder;
            switch (load_more_status) {
                case PULLUP_LOAD_MORE:
                    footViewHolder.foot_view_item_tv.setText("上拉加载更多...");
                    break;
                case LOADING_MORE:
                    footViewHolder.foot_view_item_tv.setText("正在加载更多数据...");
                    break;
            }
        }


//上拉状态改变
 //上拉加载提示语状态修改
    public void changeMoreStatus(int status){
        load_more_status=status;
        notifyDataSetChanged();
    }


ps:本demo中实现了左滑删除的功能,可自行下载demo测试

大功告成

详情可自行下载demo,地址点这


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值