Recycleview下拉刷新,上拉加载的思路

来源:互联网 发布:稳定的排序算法 编辑:程序博客网 时间:2024/05/17 00:51

1.事件处理,跟listview一样,重写ontouch,判断状态等。在加载的事件中,给this.getAdapter.mList的最后一个位置添加数据;刷新的事件中,给this.getAdapter.mList的第一个位置添加数据。在onTouch的Up方法中,进行数据的删除工作,这样就是实现了下拉显示动画,抬手就消失。

2.关键点,listview有addHeadView和addFootView;recycleview没有这个方法,所以需要在adapter的getItemViewType方法中做文章;这里返回顶部和底部view的type,根据type去加载布局。



实例:

Recycleview

public class MyRecycleview extends RecyclerView {    public OnScrollChageListener onScrollChageListener;    public void setOnScrollChageListener(OnScrollChageListener onScrollChageListener) {        this.onScrollChageListener = onScrollChageListener;    }    public interface OnScrollChageListener {        void onLoadMore();        void onRefresh();    }    ;    public MyRecycleview(Context context) {        super(context);    }    public MyRecycleview(Context context, @Nullable AttributeSet attrs) {        super(context, attrs);    }    public MyRecycleview(Context context, @Nullable AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);    }    float y;    //这个加载中的item是否已经添加了,已经添加就不再重复添加    boolean hadShow;    //是否需要走加载或者刷新的方法    boolean isJiaZai;    boolean isShuaXin;    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_UP:                MyRecycleviewAdapter adapter = (MyRecycleviewAdapter) this.getAdapter();                hadShow = false;                if (isJiaZai) {                    isJiaZai = false;                    isJiaZai = false;                    //加载,删第最后一个                    adapter.mList.remove(adapter.mList.size() - 1);                    this.getAdapter().notifyDataSetChanged();                }                if (isShuaXin) {                    isJiaZai = false;                    isJiaZai = false;                    //刷新,删第一个                    adapter.mList.remove(0);                    this.getAdapter().notifyDataSetChanged();                }                break;            case MotionEvent.ACTION_DOWN:                y = event.getY();                hadShow = false;                break;            case MotionEvent.ACTION_MOVE:                MyRecycleviewAdapter adapter1 = (MyRecycleviewAdapter) this.getAdapter();                Log.e("Recycleview滚动事件", "==========");                float yp = event.getY();                if ((yp - y) > 0.1 * MyUtils.height) {//表示可以走方法了                    isShuaXin = true;                    isJiaZai = false;                    Log.e("下拉了", "========");                    if (hadShow) {                    } else {                        hadShow = true;                        Collections.reverse(adapter1.mList);                        //加头                        Bean bean = new Bean();                        bean.setHeadOrFootView(true);                        adapter1.mList.add(bean);                        Collections.reverse(adapter1.mList);                        this.getAdapter().notifyDataSetChanged();                    }                    onScrollChageListener.onLoadMore();                } else if ((yp - y) < -0.0 * MyUtils.height) {                    Log.e("上拉了", "========");                    isJiaZai = true;                    isShuaXin = false;                    //加尾巴                    if (hadShow) {                    } else {                        Bean bean = new Bean();                        bean.setHeadOrFootView(true);                        hadShow = true;                        adapter1.mList.add(bean);                        this.getAdapter().notifyDataSetChanged();                        onScrollChageListener.onRefresh();                    }                }            default:                Log.e("Recycleview的其他事件", "=============");                break;        }        return super.onTouchEvent(event);    }}
Adapter

跟普通的相同,就是处理下type。


不足:和adapter和bean的关联性太大,扩展性差差差


解决方案:

定义一个bean,在这个bean中有一个isHeadOrFoot的变量,初始化给false;对于不同的model,必须继承该bean。

对于adapter的依赖性,解决方案暂无。

对于adapter,跟自定义recycleview有关的部分是adapter中的list;所以给定一个adapter,该adapter有一个list变量,自己项目逻辑的adater通过继承然后使用adaper.setList赋值来实现。(该方法待测试,待续)

阅读全文
0 0
原创粉丝点击