文档章节

Android开发操作案例分享!

小贱1991
 小贱1991
发布于 2016/08/04 09:37
字数 1473
阅读 30
收藏 2

Android开发操作案例分享!

Android LRecyclerView 操作案例分享-实现下拉刷新、滑动到底部自动加载,一直想抽空写下这个开源项目www.lampbrother.net,但是各种原因没有抽时间,今天还是趁着工作间隙写下了这篇博客,与大家分享。

 

简介

LRecyclerView是支持addHeaderView、 addFooterView、下拉刷新、分页加载数据的RecyclerView。

它对 RecyclerView 控件进行了拓展,给RecyclerView增加HeaderView、FooterView,并且不需要对你的Adapter做任何修改。

 

主要功能

下拉刷新、滑动到底部自动加载下页数据;

可以方便添加Header和Footer;

头部下拉样式可以自定义;

具备item点击和长按事件。

网络错误加载失败点击Footer重新请求数据;

可以动态为FooterView赋予不同状态(加载中、加载失败、滑到最底等)。

 

感谢

如果我比别人看得远些,那是因为我站在巨人们的肩上。 (牛顿)

本开源控件是基于 HeaderAndFooterRecyclerView 开源项目而来,在原基础上进行了扩充。在此感谢兄弟连教育(www.lampbrother.net)的分享

 

Gradle

Step 1. 在你的根build.gradle文件中增加JitPack仓库依赖。

 

allprojects {

    repositories {

        jcenter()

        maven { url "https://jitpack.io" }

    }

}

Step 2. 在你的model的build.gradle文件中增加LRecyclerView依赖。

 

compile 'com.github.jdsjlzx:LRecyclerView:1.0.0'

使用

 

添加HeaderView、FooterView

 

mDataAdapter = new DataAdapter(this);

        mDataAdapter.setData(dataList);

        mHeaderAndFooterRecyclerViewAdapter = new HeaderAndFooterRecyclerViewAdapter(this, mDataAdapter);

        mRecyclerView.setAdapter(mHeaderAndFooterRecyclerViewAdapter);

        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        //add a HeaderView

        RecyclerViewUtils.setHeaderView(mRecyclerView, new SampleHeader(this));

        //add a FooterView

        RecyclerViewUtils.setFooterView(mRecyclerView, new SampleFooter(this));

注意:

mHeaderAndFooterRecyclerViewAdapter = new HeaderAndFooterRecyclerViewAdapter(this, mDataAdapter);

HeaderAndFooterRecyclerViewAdapter提供了一些实用的功能,使用者不用关心它的实现,只需构造的时候把自己的mDataAdapter以参数形式传进去即可。

 

下拉刷新和加载更多

为了大家使用方便,将需要用的方法统一封装到接口LScrollListener中。

 

mRecyclerView.setLScrollListener(new LRecyclerView.LScrollListener() {

            @Override

            public void onRefresh() {

            }

            @Override

            public void onScrollUp() {

            }

            @Override

            public void onScrollDown() {

            }

            @Override

            public void onBottom() {

            }

            @Override

            public void onScrolled(int distanceX, int distanceY) {

            }

        });

LScrollListener实现了nRefresh()、onScrollUp()、onScrollDown()、onBottom()、onScrolled五个事件,如下所示:

 

void onRefresh();//pull down to refresh

void onScrollUp();//scroll down to up

void onScrollDown();//scroll from up to down

void onBottom();//load next page

void onScrolled(int distanceX, int distanceY);// moving state,you can get the move distance

onRefresh()——RecyclerView下拉刷新事件;

onScrollUp()——RecyclerView向上滑动的监听事件;

onScrollDown()——RecyclerView向下滑动的监听事件;

onBottom()——RecyclerView滑动到底部的监听事件;

onScrollDown()——RecyclerView正在滚动的监听事件;

加载更多(加载下页数据)

 

从上面的LScrollListener介绍中就可以看出,实现加载更多只要在onBottom()接口中处理即可。

 

 

下拉刷新

为了达到和Listview的下拉刷新效果,本项目没有借助SwipeRefreshLayout控件,而是在自定义RecyclerView头部实现的刷新效果。

 

这里的下拉刷新效果借鉴了开源库:AVLoadingIndicatorView

 

mRecyclerView.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);

mRecyclerView.setArrowImageView(R.drawable.iconfont_downgrey);

AVLoadingIndicatorView库有多少效果,LRecyclerView就支持多少下拉刷新效果,当然你也可以自定义下拉效果。

 

下拉刷新逻辑处理:

 

从上面的LScrollListener介绍中就可以看出,实现下拉刷新只要在onRefresh()接口中处理即可。

 

加载网络异常处理

 

加载数据时如果网络异常或者断网,LRecyclerView为你提供了重新加载的机制。

 

网络异常出错代码处理如下:

RecyclerViewStateUtils.setFooterViewState(getActivity(), mRecyclerView, getPageSize(), LoadingFooter.State.NetWorkError, mFooterClick);

private View.OnClickListener mFooterClick = new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            RecyclerViewStateUtils.setFooterViewState(getActivity(), mRecyclerView, getPageSize(), LoadingFooter.State.Loading, null);

            requestData();

        }

    };

上面的mFooterClick就是我们点击底部的Footer时的逻辑处理事件,很显然我们还是在这里做重新请求数据操作。

 

点击事件和长按事件处理

 

在Hongyang前辈的博客中有下描述:

 

Click and LongClick

 

不过一个挺郁闷的地方就是,系统没有提供ClickListener和LongClickListener。

不过我们也可以自己去添加,只是会多了些代码而已。

实现的方式比较多,你可以通过mRecyclerView.addOnItemTouchListener去监听然后去判断手势, 当然你也可以通过adapter中自己去提供回调,这里我们选择后者,前者的方式,大家有兴趣自己去实现。

 

Hongyang大神选择了后者,LRecyclerView早期选择了前者,经过实践总结,在adapter中实现点击事件会好点。

 

先看下怎么使用:

mHeaderAndFooterRecyclerViewAdapter.setOnItemClickLitener(new OnItemClickLitener() {

            @Override

            public void onItemClick(View view, int position) {

 

            }

 

            @Override

            public void onItemLongClick(View view, int position) {

 

            }

        });

原理就是实现viewHolder.itemView的点击和长按事件。由于代码过多就不贴出来了。

 

viewHolder.itemView是RecyclerView.Adapter中本身就具有的,不用额外定义。

 

源码如下:

public static abstract class ViewHolder {

        public final View itemView;

        int mPosition = NO_POSITION;

        int mOldPosition = NO_POSITION;

        long mItemId = NO_ID;

        int mItemViewType = INVALID_TYPE;

        int mPreLayoutPosition = NO_POSITION;

设置空白View(setEmptyView)

 

mRecyclerView.setEmptyView(view);

注意布局文件:

 

<RelativeLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    >

 

    <com.cundong.recyclerview.LRecyclerView

        android:id="@+id/list"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"/>

 

    <include

        android:id="@+id/empty_view"

        layout="@layout/layout_empty"

        android:visibility="gone"/>

</RelativeLayout>

分享

 

介绍完了LRecyclerView,似乎还少些什么,对了,那就是adapter了。

 

为了方便大家使用,分享个封装过的adapter。

 

public class ListBaseAdapter<T extends Entity> extends RecyclerView.Adapter {

    protected Context mContext;

    protected int mScreenWidth;

 

    public void setScreenWidth(int width) {

        mScreenWidth = width;

    }

 

    protected ArrayList<T> mDataList = new ArrayList<>();

 

    @Override

    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        return null;

    }

 

    @Override

    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

 

    }

 

    @Override

    public int getItemCount() {

        return mDataList.size();

    }

 

    public List<T> getDataList() {

        return mDataList;

    }

 

    public void setDataList(Collection<T> list) {

        this.mDataList.clear();

        this.mDataList.addAll(list);

        notifyDataSetChanged();

    }

 

    public void addAll(Collection<T> list) {

        int lastIndex = this.mDataList.size();

        if (this.mDataList.addAll(list)) {

            notifyItemRangeInserted(lastIndex, list.size());

        }

    }

    public void clear() {

        mDataList.clear();

        notifyDataSetChanged();

    }

}

 

ListBaseAdapter使用了泛型,简单方便,消除了强制类型转换。

 

使用如下:

 

private class DataAdapter extends ListBaseAdapter<ItemModel>{

 

        private LayoutInflater mLayoutInflater;

 

        public DataAdapter(Context context) {

            mLayoutInflater = LayoutInflater.from(context);

            mContext = context;

        }

 

        @Override

        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            return new ViewHolder(mLayoutInflater.inflate(R.layout.sample_item_text, parent, false));

        }

 

        @Override

        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

            ItemModel item = mDataList.get(position);

 

            ViewHolder viewHolder = (ViewHolder) holder;

            viewHolder.textView.setText(item.title);

        }

 

 

        private class ViewHolder extends RecyclerView.ViewHolder {

 

            private TextView textView;

 

            public ViewHolder(View itemView) {

                super(itemView);

                textView = (TextView) itemView.findViewById(R.id.info_text);

            }

        }

    }

ListBaseAdapter虽然功能不强大,但是使用很方便。

 

结语

LRecyclerView使用方便简单,无论你添加多少Header和Footer,你都不用担心position的问题,除了方便还是方便。大家用起来吧!

© 著作权归作者所有

小贱1991
粉丝 1
博文 24
码字总数 25924
作品 0
昌平
私信 提问
Android RxJava: 这是一份全面的 操作符 使用汇总 (含详细实例讲解)

前言 ,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 开发者的欢迎。 如果还不了解RxJava,请看文章:Android:这是一篇 清晰 & 易懂的Rxjava 入门教程 如此受欢迎的原...

Carson_Ho
2018/05/31
0
0
北京GDG开源Linux开发经验及典型应用案例分享讲座报名

谷歌北京技术开发者社区(北京GDG)又要举办活动啦,将于2013年6月15日(周六)下午1:30-5:30在北京翠宫饭店二楼多功能厅 举办一场“开源Linux开发经验及典型应用案例分享”的技术讲座,讲座中...

红薯
2013/05/21
540
9
北京GDG开源Linux开发经验及典型应用案例分享讲座报名

谷歌北京技术开发者社区(北京GDG)又要举办活动啦,将于2013年6月15日(周六)下午1:30-5:30在北京翠宫饭店二楼多功能厅 举办一场“开源Linux开发经验及典型应用案例分享”的技术讲座,讲座中...

红薯
2013/05/21
2
0
AndroidThings之基础一 基本概念

转载自:https://blog.csdn.net/weixin41636248/article/details/79069994 Android Things是什么 一句话说,AndroidThings就是让开发者可以使用Android开发工具开发嵌入式设备。 If you can...

qq_28831197
2018/05/09
0
0
android -------- Data Binding的使用(一)

Google推出自己官方的数据绑定框架Data Binding Library 已经很久了,很多企业也在使用 面试的时候也有问到,所以也去学习了一番,特来分享一下,希望对各位有所帮助 描述: Data Binding 是...

切切歆语
2018/07/18
24
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在Linux中复制文档

在办公室里复印文档过去需要专门的员工与机器。如今,复制是电脑用户无需多加思考的任务。在电脑里复制数据是如此微不足道的事,以致于你还没有意识到复制就发生了,例如当拖动文档到外部硬盘...

老孟的Linux私房菜
39分钟前
11
0
SpringBoot 集成MongoDB

一、MongoDB 简介 MongoDB 如今是最流行的 NoSQL 数据库,被广泛应用于各行各业中,很多创业公司数据库选型就直接使用了 MongoDB,但对于大部分公司,使用 MongoDB 的场景是做大规模数据查询...

zw965
47分钟前
22
0
使用 Envoy 和 AdGuard Home 阻挡烦人的广告

> 原文链接:使用 Envoy 和 AdGuard Home 阻挡烦人的广告 通常我们使用网络时,宽带运营商会为我们分配一个 DNS 服务器。这个 DNS 通常是最快的,距离最近的服务器,但会有很多问题,比如: ...

米开朗基杨
今天
29
0
springboot之全局处理异常封装

springboot之全局处理异常封装 简介 在项目中经常出现系统异常的情况,比如NullPointerException等等。如果默认未处理的情况下,springboot会响应默认的错误提示,这样对用户体验不是友好,系...

Purgeyao
今天
32
0
cookie

cookie: n. 饼干;小甜点 为什么会引入Cookie(在客户端保持http状态) 因为http协议是一种无状态协议,web服务器本身不能识别出哪些请求是同一个服务器发送的,浏览器的每一次请求都是独立...

五公里
今天
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部