Android 5.0 v7扩展包之RecyclerView的使用以及通用适配器的封装实现

添加Gradle依赖

compile ‘com.android.support:appcompat-v7:23.2.1‘compile ‘com.android.support:recyclerview-v7:23.2.1‘

备注:recyclerview的版本号要与appcompat的一致,此处为: v7:23.2.1

以泛型方式定义通用RecyclerViewHold对象,内部以SparseArray存储View对象,提高xml的解析速度。

/** * Created by Administrator on 2016/6/14. * 通用Recycler.ViewHolder */public class UnityRecyclerAdapterViewHolder extends RecyclerView.ViewHolder {    private static final UtilsLog lg = UtilsLog.getLogger(UnityRecyclerAdapterViewHolder.class);    private SparseArray<View> mViews;    private View mConvertView;

    public UnityRecyclerAdapterViewHolder(View itemView, ViewGroup parent) {        super(itemView);        this.mConvertView = itemView;        this.mViews = new SparseArray<>();}

    public View getConvertItemView() {        return mConvertView;}

    /**     * 通过viewId获取控件     *     * @param viewId* @return*/public <T extends View> T generateView(int viewId) {        View view = mViews.get(viewId);        if (view == null) {            view = mConvertView.findViewById(viewId);mViews.put(viewId, view);}        return (T) view;}

    public <T extends View> T generateView(int viewId, Class<T> clz) {        return (T) generateView(viewId);}}

重写onCreateViewHolder与onBindViewHolder,其中onCreateViewHolder为每个Item生成View对象,并封装至ViewHolder中返回;onBindViewHolder负责渲染数据至View

/** * Created by Administrator on 2016/6/15. * Recycler.Adapter基类 * 1.getItemLayoutId与getItemLayoutView二者选择其一进行复写:此处为支持布局以及代码方式 * 2.该类还可以继续扩展,对仅有单个布局的情况,可以通过构造方法直接注入itemLayoutId */public abstract class AbsUnityBaseRecyclerAdapter<T> extends RecyclerView.Adapter<UnityRecyclerAdapterViewHolder> implements INotifyAdapterDataSetChange {

    private static final UtilsLog lg = UtilsLog.getLogger(AbsUnityBaseRecyclerAdapter.class);    private IAdapterDataModifyHelper<T> IAdapterataModifyHelper;//操作数据的Helper类private LayoutInflater layoutInflater;

    public AbsUnityBaseRecyclerAdapter() {        this.IAdapterataModifyHelper = new DataModifyHelper<>();}

    public IAdapterDataModifyHelper<T> getDataModifyHelper() {        this.IAdapterataModifyHelper.setNotifyAdapterDataSetChange(this);        return IAdapterataModifyHelper;}

    /*系统重写函数*/@Overridepublic UnityRecyclerAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        lg.e("onCreateViewHolder");        if (this.layoutInflater == null) {            this.layoutInflater = LayoutInflater.from(parent.getContext());}        return new UnityRecyclerAdapterViewHolder(getItemLayoutView(viewType), parent);}

    @Overridepublic void onBindViewHolder(UnityRecyclerAdapterViewHolder holder, int position) {        lg.e("onBindViewHolder with postion[" + position + "]:" + holder.toString());convert(IAdapterataModifyHelper.getDataResources().get(position), holder, position);}

    @Overridepublic int getItemCount() {        return IAdapterataModifyHelper.getDataResources().size();}

    /**     * 填充数据     *     * @param viewHolder* @param position*/public abstract void convert(T itemEntity, UnityRecyclerAdapterViewHolder viewHolder, int position);

/**     * 通过ItemViewType返回布局id     *     * @param viewType* @return*/public int getItemLayoutId(int viewType) {        return 0;}

    /**     * 通过viewType返回指定Item布局     *     * @param viewType* @return*/public View getItemLayoutView(int viewType) {        return layoutInflater.inflate(getItemLayoutId(viewType), null);}

    @Overridepublic void notifyAdapter() {        notifyDataSetChanged();}}

具体使用方式如下,

adapter = new SingleItemRecyclerAdapter<CorePageEntity>(R.layout.simple_item_horizontal) {    @Overridepublic void convert(CorePageEntity itemEntity, UnityRecyclerAdapterViewHolder viewHolder, int position) {        if (position != 0) {            lg.e("convert with position " + position + ":" + viewHolder.toString());}        viewHolder.generateView(R.id.imgItemCommon, ImageView.class).setVisibility(View.GONE);viewHolder.generateView(R.id.tvItemCommon, TextView.class).setText(itemEntity.getCorePageTitle());}};

gridActMain.setAdapter(adapter);gridActMain.setLayoutManager(new GridLayoutManager(getCurActivity(), 1));

adapter.getDataModifyHelper().setDataResource(//添加数据集);

源码链接:https://github.com/xiaoxuan948/AndroidUnityLab/tree/master/unity_base_dev_helper/src/main/java/com/coca/unity_base_dev_helper/adapter/recycler_view

扩展功能包括刷新、添加头尾布局,请查看http://m.blog.csdn.net/article/details?plg_nld=1&id=51153978&plg_auth=1&plg_uin=1&plg_usr=1&plg_vkey=1&plg_nld=1&plg_dev=1

# 后续添加onItemClicklistener事件

来自为知笔记(Wiz)

时间: 2024-10-24 23:25:10

Android 5.0 v7扩展包之RecyclerView的使用以及通用适配器的封装实现的相关文章

Android5.0 v7扩展包之RecyclerView

Android5.0 v7扩展包之RecyclerView Android开发文章 androidRecyclerView 近日Google发布了Android5.0 SDK,随之android L的部分预览功能也发布了正式版本.本文将介绍RecyclerView. RecylerView简介 The RecyclerView widget is a more advanced and flexible version of ListView. This widget is aContainer

Android 7.0 Nougat(牛轧糖)---对开发者来说

android 7.0出来了.让你的app准备迎接最新的android版本吧,支持节省电量和内存,这样新的系统行为.使用多窗口UI.直接恢复通知以及其他操作来扩展你的app. android 7.0介绍了各种各样的新功能给用户和开发者, 本文重点介绍面向开发者的一些新功能. 确保检查android 7.0的行为变化,了解有关平台的变化可能会影响你的app. 如果要了解更多的关于用户的新功能,请查看www.android.com. 1.支持多窗口 在android 7.0中,我们介绍了在支持多窗口

【译】Android 7.0 for Developers

译者注: 译者:aroundme 原文地址:https://developer.android.com/about/versions/nougat/android-7.0.html 主要是介绍Android 7.0提供新特性. 翻译的动机主要是为了适配Android 7.0,提前踩点.防止大坑. 就翻译来看,除去一些可有可无的更新之外,关注点主要是集中在四点: * 通知栏一系列更新 * 对于应用后台优化(或者说限制) * WebView持续性更新(混合开发需要注意) * 对于GPU的优化,优化3

android v7兼容包RecyclerView的使用(二)

上篇文章 android v7兼容包RecyclerView的使用(一)讲了RecyclerView的最基本用法,现在开始挖掘更详细的内容. 在RecyclerView的API中,有这样一句话 A flexible view for providing a limited window into a large data set. 大致意思就是:当有大量的数据显示在一个有限大小的窗口上时,RecyclerView就是解决这种情况的一个灵活的View. 从以上描述可以看出RecyclerView的

android v7兼容包RecyclerView的使用(三)——布局管理器的使用

前两篇文章 android v7兼容包RecyclerView的使用(二) android v7兼容包RecyclerView的使用(一) 介绍了RecyclerView的基本用法以及与它相关的重要的几个类,本篇文章介绍布局管理器的具体用法. 为了演示布局管理器的使用,找了很多个例子,都没有找到感觉合适的例子,后来google了一把,发现了一个比较适合说明问题的例子.所以就拿该例子来解释吧. 在演示布局管理器前,我们先把UI部分搭建完成.由于使用到了V7兼容包的另一个包CardView,所以在这

android v7兼容包RecyclerView的使用(四)——点击事件的不同方式处理

前三篇文章 android v7兼容包RecyclerView的使用(三)--布局管理器的使用 android v7兼容包RecyclerView的使用(二) android v7兼容包RecyclerView的使用(一) 介绍了RecyclerView的使用以及常见的相关类和布局管理器的灵活之处.写了这么多篇,还没涉及到用户交互,那么怎么处理点击事件呢. 在RecyclerView中你会惊奇的发现,该类中并没有OnItemClickListener监听器监听我们的单击事件,也没有OnItemL

Android 6.0 IMS流程(二)——接口扩展(从RIL到APP)

平时工作中,经常有这样的需求,就是从RIL层一直到APP,添加一个新接口给APP调用,方便系统APP或者第三方APP通过这个接口获取或者改变modem中某些的值.状态等. 基于高通平台,有三种方式去实现这种接口: 扩展ImsSenderRxr,依赖ImsService来实现. 扩展RILJ,依赖Phone进程来实现. 结合1和2,依赖Phone进程来实现. 其中,第一种方式最简单,第二种次之,第三种最复杂:但是每种方式各自有各自的限制条件以及适用范围. 本文来自http://blog.csdn.

Android 7.0 以上 Charles 和 Fiddler 无法抓取 HTTPS 包的解决方式

Android 7.0 以上 Charles 和 Fiddler 无法抓取 HTTPS 包的解决方式 https://johnnyshieh.me/posts/android-7-capture-https-package/ 发表于 2019-05-06 | 分类于 Android| 0| 阅读次数 最近升级了 targetSdkVersion 到 28 后发现在 Android 7.0 以上机型 Charles 抓取 https 包时显示找不到证书,但是 Android 6.0 机型还是可以正

Android 6.0 Marshmallow介绍

Android 6.0 Marshmallow介绍 Android 6.0 (M) 为用户和应用开发者提供了新功能.本文旨在介绍其中最值得关注的 API和重点介绍您应该了解并在开发应用时加以考虑的一些主要变更. 1.Android 6.0新增功能与特性 指纹身份验证: 此版本提供了一些新的 API,在受支持的设备上,用户只需扫描其指纹即可完成身份验证,这些 API 还可与 Android 密钥库系统结合使用. 要通过指纹扫描验证用户身份,请获取新 FingerprintManager 类的实例,