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

本文介绍 RecyclerView 的基本使用方法,包括如何实现下拉刷新和上拉加载更多功能,并提供了一个简单的项目示例。此外,还讨论了 RecyclerView 与 ListView 的区别及如何自定义分隔线。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直用的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我就不给出来了,自己下载了看吧。项目链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海晨忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值