`
itxdl
  • 浏览: 26921 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Android开发操作案例分享!

阅读更多
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的问题,除了方便还是方便。大家用起来吧!
分享到:
评论

相关推荐

    Android经典项目案例开发实战宝典实例源文件 下)

    在本资源中,"Android经典项目案例开发实战宝典实例源文件(下)",包含的是13到22个Android应用开发的经典案例,这些案例是深入理解和掌握Android开发技术的重要资源。每个案例都提供了完整的源代码,有助于开发者...

    Android开发十个案例

    在Android开发领域,掌握各种案例应用是提升技能和理解平台特性的关键。以下是对"Android开发十个案例"的详细解析: 1. **登录与注册模块**:这是任何应用程序的基础,通常涉及用户界面(UI)设计,包括输入框、...

    Android 开发实践案例

    总的来说,这三个案例覆盖了Android开发的多个重要方面,包括基本的编程语言、UI设计、网络通信、地图服务、数据库操作、游戏逻辑以及社交功能的实现。通过深入学习和实践这些案例,开发者可以全面提高Android开发...

    Android应用案例开发大全源码

    《Android应用案例开发大全》是一本专注于Android应用程序开发实践的资源集合,包含了多个章节的源码,涵盖了Android开发的关键技术和应用场景。源码的分段上传显示了作者在分享时的贴心考虑,尽管受到文件大小限制...

    android经典开发案例60个(源码类)

    在Android开发领域,掌握经典案例是提升技能的关键。"Android经典开发案例60个(源码类)"这个资源集合提供了丰富的实践项目,涵盖了多种功能和应用场景,旨在帮助开发者深入理解Android开发的核心技术和最佳实践。...

    Android开发精典案例(珍贵的学习资料)

    在Android开发领域,掌握经典案例是提升技能的关键步骤。这份"Android开发精典案例(珍贵的学习资料)"包含了60个实例,涵盖了Android应用开发的各个方面,为开发者提供了丰富的实践素材。下面,我们将深入探讨这些...

    Android移动开发十个案例源码

    5. **更多案例源码**:除了上述四个案例,还有其他的案例,这些可能包括网络请求、数据库操作、地图集成、推送通知、社交分享等多个方面。例如,网络请求通常会用到Retrofit或Volley库,数据库操作会涉及到SQLite,...

    Android应用案例开发大全.pdf

    根据提供的信息,《Android应用案例开发大全》是一本完整的电子书籍,主要聚焦于Android平台上的应用程序设计与实现。本文将从该书可能涵盖的角度出发,详细阐述Android应用开发中的一些核心概念、关键技术以及实用...

    移动应用开发教程、案例及相关项目

    ### 移动应用开发教程与案例详解:使用Flutter构建待办事项应用 #### 一、基础知识概述 在深入了解具体的开发步骤之前,我们首先简要回顾一下移动应用开发的基础概念及Flutter框架的特点。 - **移动应用开发**: ...

    Android开发案例驱动 光盘 (G).z05

    书 名:Android开发案例驱动教程 丛书名:移动平台开发书库 关东升 赵志荣 等编著 机械工业出版社 责任编辑 郝建伟 书 号 见本光盘盘面 对应盘号 见本光盘盘面 一、光盘内容介绍 1.书中所有实例运行在相应的...

    Android开发案例驱动 光盘 (G).z01

    书 名:Android开发案例驱动教程 丛书名:移动平台开发书库 关东升 赵志荣 等编著 机械工业出版社 责任编辑 郝建伟 书 号 见本光盘盘面 对应盘号 见本光盘盘面 一、光盘内容介绍 1.书中所有实例运行在相应的...

    Android开发关键技术与精彩案例

    因此,接下来的内容我将结合Android开发的关键技术和精彩案例的相关知识点来进行详细说明。 首先,Android作为目前最流行的智能手机操作系统之一,其开发涉及了广泛的技术领域。关键技术领域主要包括: 1. Android...

    《用Kotlin做Android开发》PDF

    8. 最佳实践与性能优化:书中将分享一些Kotlin和Android开发的最佳实践,如代码风格指南、内存管理、性能优化技巧等,以帮助开发者写出高质量的代码。 9. 实战项目:通过一个或多个实战项目的案例分析,将理论知识...

    android开发十个案例打包下载

    在Android开发领域,掌握实际案例的实践是提升技能的关键步骤。"android开发十个案例打包下载"提供了一系列实用的示例项目,涵盖了多个重要的Android应用程序功能模块。这些案例可以帮助开发者深入理解Android SDK,...

    Android 开发源码分享之在线音乐播放器完整项目.rar

    首先,我们要了解Android开发的基础知识。Android是由Google主导开发的开源移动操作系统,它基于Linux内核,支持各种移动设备,如智能手机和平板电脑。开发者通常使用Java或Kotlin语言进行编程,并利用Android ...

    Android开发艺术探索pdf版

    《Android开发艺术探索》是一本深受Android开发者喜爱的书籍,旨在帮助开发者提升技能,创造更具吸引力的应用。这本书全面深入地探讨了Android应用开发的各种技术和实践,涵盖了从基础到高级的多个层面。 首先,书...

    android开发案例大全第二版源代码 1-6章

    《Android开发案例大全第二版源代码 1-6章》是一个综合性的学习资源,涵盖了Android应用开发的基础到进阶知识。这份源代码是书籍的配套实践部分,旨在帮助读者通过实际操作来深化对Android编程的理解。以下是根据...

    《Android移动开发案例教程》-源代码B

    该书由黑马程序员编著,是工业和信息化“十三五”人才培养规划的重要教材之一,意在为学生提供系统的Android开发学习路径。 在源代码B中,包含了多个章节的实践项目,这些项目可以帮助读者更好地理解和应用所学理论...

    Android 3D游戏开发技术宝典-OpenGL ES 2.0 (吴亚峰) 源代码

    1.3 如何搭建android开发环境 4 1.3.1 sdk的安装及环境配置 5 1.3.2 eclipse集成开发环境的搭建 7 1.3.3 创建并启动模拟器 9 1.4 hello android应用程序的开发 11 1.4.1 第一个android应用程序 12 ...

Global site tag (gtag.js) - Google Analytics