RecyclerView的简单使用,实现下拉刷新、上拉加载

来源:互联网 发布:网络建设与管理答案 编辑:程序博客网 时间:2024/06/05 10:49
一直用的ListView、最近才听别人说了一种控件RecyclerView,说是listView和gridview的升级版,就去研究了一下。把最简单的下拉刷新、上拉加载做出来了。本来研究这个东西,是想把侧滑删除,类似于QQ的效果做出来的,结果能力有限。首先,recyclerview是v7包里面的,要是想用这个控件就先去晚上找jar包吧。我是直接用AS的在线导包。这里我用到了两个包。recyclerview的com.android.support:recyclerview-v7:23.2.0,还有一个是cardview的com.android.support:cardview-v7:23.2.0。因为recyclerview的分隔线还要自己划,真特么坑爹。不过我也写了,后面有。这里我贴出主要代码,后面有项目安装包,下了看咯。反正不要积分。其实,我觉得recyclerview的用法跟listView是差不多的。都是拿数据,设置adapter。就是recyclerview多了几个方法。
@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        context = this;        initData();        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe);        verRecycler = (RecyclerView) findViewById(R.id.ver_recycle);        mLayoutManager = new LinearLayoutManager(context);  //布局管理器        verRecycler.setLayoutManager(mLayoutManager);//        verRecycler.addItemDecoration(new MyVerDividerItemDecoration(context, MyVerDividerItemDecoration.VERTICAL_LIST)); //分隔线        MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(mDatas, context);        verRecycler.setAdapter(adapter);    //设置adapter        setOnRefresh(); //刷新        setLoadMore();//加载    }
这是oncreate方法。recyclerview要有一个布局管理器。因为,他不仅可以竖着变成listview,他还可以横着变成gridview。他有三个子类,我这里用的是其中一个LinearLayoutManager。下面分别给出刷新和到底加载的方法,我没有重写recyclerview,所以,没有什么头布局,脚布局。据说,写起来很麻烦。
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {            @Override            public void onRefresh() {                if(isLoading){  //要刷新的时候,判断有没有在加载数据,如果在加载数据,就不让用户刷新                    swipeRefreshLayout.setRefreshing(false);                    Toast.makeText(context, "正在加载,请稍后刷新", Toast.LENGTH_SHORT).show();                    return;                }                isRefresh = true;                swipeRefreshLayout.setRefreshing(true);               if(timer ==null) timer = new Timer();               if(timerTask==null) timerTask = new TimerTask() {                    @Override                    public void run() {                        if (i == 0) {                            handler.sendEmptyMessage(0x001);                        } else {                            handler.sendEmptyMessage(0x002);                        }                    }                };                i = 3;                timer.schedule(timerTask, 0, 1000);            }        });
刷新我用的是SwipeRefreshLayout。这是谷歌出的一个控件。用起来感觉还不错。我之前刷新加载都是用的PullToRefresh的第三方jar。不过这个我已经用习惯了,我还是觉得PullToRefresh好用一些。
verRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() {            @Override            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {                super.onScrolled(recyclerView, dx, dy);                int lastVisibleItem = ((LinearLayoutManager) mLayoutManager).findLastVisibleItemPosition();                int totalItemCount = mLayoutManager.getItemCount();                Log.v("WZ", "dx:" + dx + "->" + "dy:" + dy);                Log.v("WZ", "lastVisibleItem:" + lastVisibleItem + "->" + "totalItemCount:" + totalItemCount);                if (lastVisibleItem == totalItemCount - 4 && dy > 0) {                    if (isRefresh) {  //到加载数据的时候,先判断有没有在刷新,如果在刷新就不让他加载                        Toast.makeText(context, "正在刷新,请稍后加载", Toast.LENGTH_SHORT).show();                        return;                    }                    if (isLoading) {                        Toast.makeText(context, "正在加载,请稍后...", Toast.LENGTH_SHORT).show();                    } else {                        isLoading = true;                    }                }            }        });

到底自动加载。这个应该见到很多遍了。没什么好说的。下面给出画线的工具类。

/** * RecyclerView画横向分隔线 * * Created by BML-KF on 2016/4/15. */public class MyVerDividerItemDecoration extends RecyclerView.ItemDecoration{    private int[] ATTRS = new int[]{android.R.attr.listDivider};    public static int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;    public static int VERTICAL_LIST = LinearLayoutManager.VERTICAL;    private Drawable mDivider;    private int mOrientation;    public MyVerDividerItemDecoration(Context context, int mOrientation) {        final TypedArray a = context.obtainStyledAttributes(ATTRS);        mDivider = a.getDrawable(0);        this.mOrientation = mOrientation;        setOrientation(mOrientation);    }    private void setOrientation(int orientation) {        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {            throw new IllegalArgumentException("invalid orientation");        }        mOrientation = orientation;    }    @Override    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {        if (mOrientation == VERTICAL_LIST) {            drawVertical(c, parent);        } else {            drawHorizontal(c, parent);        }    }    public void drawVertical(Canvas c, RecyclerView parent) {        final int left = parent.getPaddingLeft();        final int right = parent.getWidth() - parent.getPaddingRight();        final int childCount = parent.getChildCount();        for (int i = 0; i < childCount; i++) {            final View child = parent.getChildAt(i);            android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child                    .getLayoutParams();            final int top = child.getBottom() + params.bottomMargin;            final int bottom = top + mDivider.getIntrinsicHeight();            mDivider.setBounds(left, top, right, bottom);            mDivider.draw(c);        }    }    public void drawHorizontal(Canvas c, RecyclerView parent) {        final int top = parent.getPaddingTop();        final int bottom = parent.getHeight() - parent.getPaddingBottom();        final int childCount = parent.getChildCount();        for (int i = 0; i < childCount; i++) {            final View child = parent.getChildAt(i);            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child                    .getLayoutParams();            final int left = child.getRight() + params.rightMargin;            final int right = left + mDivider.getIntrinsicHeight();            mDivider.setBounds(left, top, right, bottom);            mDivider.draw(c);        }    }    @Override    public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {        if (mOrientation == VERTICAL_LIST) {            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());        } else {            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);        }    }}

至于Adapter我就不给出来了,自己下载了看吧。项目链接

1 1
原创粉丝点击