查看: 187|回复: 0

真实项目运用-RecyclerView封装

[复制链接]
发表于 2016-9-16 09:19:03 |未经授权,严禁转载,违者必究... | |阅读模式
封装 真实 项目 RecyclerView recyclerview封装 recyclerview再封装 recyclerview的封装 recyclerview android recyclerview recyclerview 分割线 recyclerview下拉刷新 xrecyclerview recyclerview横向滑动
原文链接:

1833901-f7c5aabbab6d5437.png

1833901-f7c5aabbab6d5437.png

项目布局
起首看看我的项目布局,项目分为common 和module模块,这里对之前整个项目标框架进行了革新,没有了之前的library,取而代之的是将所有公用组件放在了common包中,这是每个项目都可以copy利用的部门。在module包中就是具体每个项目标每个模块。好比这个示例项目中,包含
recyclerView组件作为每个项目中都可以利用的组件,这里放在common-widgets-recyclerview包下

这里可以看到的recyclerView组件这里添加了adapter,base,divider,section,utils,wrapper包。下面来进行深切的讲解以及如何在项目开辟中进行利用吧。
RecyclerView is a more advanced and flexible version of ListView. This widget is a container for large sets of views that can be recycled and scrolled very efficiently. Use the RecyclerView widget when you have lists with elements that change dynamically.
RecyclerView 是Android L版本中新添加的一个用来代替ListView的SDK,它的矫捷性与可替代性比listview更好。RecyclerView与ListView道理是近似的:都是仅仅维护少量的View而且可以展示年夜量的数据集。在RecyclerView尺度化了ViewHolder近似于ListView中convertView用来做视图缓存。
看看凡是处置itemView的type类型分歧的方式:
这里对方式getItemViewType()
这里也对这种环境进行了处置的封装:
看看现实项目中的结果,一个adapter就完成了所有的分歧的item类型操作。
整个类继续自MultiItemTypeAdapter:
来看看MultiItemTypeAdapter
MultiItemTypeAdapter,这里首要完成了List形式添加数据,数据类型利用泛型操作,只需要在组织函数中,或者public方式 addDataAll就可以添加列表类型数据。操纵ItemViewDelegateManager完成分歧类型type的治理.而添加分歧的type是对接口ItemViewDelegate的实现。ItemViewDelegateManager起到了一个中心治理者和代办署理者的感化。具体看下面的代码:
package com.app.gzgov.common.widgets.recyclerview.base;
import android.support.v4.util.SparseArrayCompat;
/**
* Created by zhy on 16/6/22.
*/
public class ItemViewDelegateManager
{
    SparseArrayCompat[I]> delegates = new SparseArrayCompat();
    public int getItemViewDelegateCount()
    {
        return delegates.size();
    }
    public ItemViewDelegateManager addDelegate(ItemViewDelegate delegate)
    {
        int viewType = delegates.size();
        if (delegate != null)
        {
            delegates.put(viewType, delegate);
            viewType++;
        }
        return this;
    }
    public ItemViewDelegateManager addDelegate(int viewType, ItemViewDelegate delegate)
    {
        if (delegates.get(viewType) != null)
        {
            throw new IllegalArgumentException(
                    "An ItemViewDelegate is already registered for the viewType = "
                            + viewType
                            + ". Already registered ItemViewDelegate is "
                            + delegates.get(viewType));
        }
        delegates.put(viewType, delegate);
        return this;
    }
    public ItemViewDelegateManager removeDelegate(ItemViewDelegate delegate)
    {
        if (delegate == null)
        {
            throw new NullPointerException("ItemViewDelegate is null");
        }
        int indexToRemove = delegates.indexOfValue(delegate);
        if (indexToRemove >= 0)
        {
            delegates.removeAt(indexToRemove);
        }
        return this;
    }
    public ItemViewDelegateManager removeDelegate(int itemType)
    {
        int indexToRemove = delegates.indexOfKey(itemType);
        if (indexToRemove >= 0)
        {
            delegates.removeAt(indexToRemove);
        }
        return this;
    }
    public int getItemViewType(T item, int position)
    {
        int delegatesCount = delegates.size();
        for (int i = delegatesCount - 1; i >= 0; i--)
        {
            ItemViewDelegate delegate = delegates.valueAt(i);
            if (delegate.isForViewType( item, position))
            {
                return delegates.keyAt(i);
            }
        }
        throw new IllegalArgumentException(
                "No ItemViewDelegate added that matches position=" + position + " in data source");
    }
    public void convert(ViewHolder holder, T item, int position)
    {
        int delegatesCount = delegates.size();
        for (int i = 0; i  delegate = delegates.valueAt(i);
            if (delegate.isForViewType( item, position))
            {
                delegate.convert(holder, item, position);
                return;
            }
        }
        throw new IllegalArgumentException(
                "No ItemViewDelegateManager added that matches position=" + position + " in data source");
    }
    public int getItemViewLayoutId(int viewType)
    {
        return delegates.get(viewType).getItemViewLayoutId();
    }
    public int getItemViewType(ItemViewDelegate itemViewDelegate)
    {
        return delegates.indexOfValue(itemViewDelegate);
    }
}
这里也就解决了多种itemViewType的问题。实现了便利的添加分歧的类型的item数据。泛型数据降低了代码的耦合度。
具体的新闻类型:
这里也就实现了单一的列表形式,好比网易新闻的专题样式:
这里直接加入wrapper包中几个类,
这里是对分歧的item的type 类型进行节制,从而获得了分歧的RecyclerView的样式
。具体可以参考我的
[exxfilelink]1[/exxfilelink]
这里对开源库SectionedRecyclerViewAdapter
1) 建立自界说 Section 类集成自 StatelessSection
2) 添加section到adapter,留意这里是SectionRVAdapter
看看界面结果
整个代码因为是对RecyclerView.Adapter封装。所以需要存眷的方式天然是getItemViewType,onBindViewHolder,createViewHolder和getItemCount四个方式,下面以这四个方式为切入点进行阐发:
初始化需要存眷的是这里利用hashMap对section进行存储
。也就实现了后面的按照section的添加挨次依次展示Section到RecyclerView中。
onCreateViewHolder完成的是ViewHolder的建立,每一个section分为头部header,底部footer。以及中心部门,中心结构可以有Loading/Loaded/Failed三种状况别离对应加载,加载成功,掉败界面。留意这里的状况都别离对应于每个section里面,而不是整个RecyclerView.
  @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ViewHolder viewHolder = null;
        View view = null;
        for (Map.Entry entry : sectionViewTypeNumbers.entrySet()) {
            if (viewType >= entry.getValue() && viewType
和前面MultiItemTypeAdapter的实现一样,我们需要按照分歧viewType建立分歧的viewHolder.可是需要留意的是一个Section是由一组item构成的,所以一个section需要多次的挪用onCreateViewHolder进行建立分歧的类型的样式

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        int currentPos = 0;
        for (Map.Entry entry : sections.entrySet()) {
            Section section = entry.getValue();
            // ignore invisible sections
            if (!section.isVisible()) continue;
            int sectionTotal = section.getSectionItemsTotal();
            // check if position is in this section
            if (position >= currentPos && position
接下来存眷getItemCount,代表整个RecyclerView的item的个数。当然是所有Section的item的总和,所以代码如下
最后需要存眷的是方式getItemViewType,这里也就完成了每个Section的五种类型的int返回操作
起首存眷的是SectionRVAdapter,这里我并没有集成自上面的MultiItemTypeAdapter,应为这里涉及到对RecyclerView.Adapter的封装操作。这里的短处也就是每一个section甚至整个RecyclerView的itemView都是一个形式。可是多种形式的section我们可以转化为将section也视作一种MultiItemTypeAdapter的item类型就能解决,所以这里也不算问题。这里是SectionRVAdapter
这篇博客就到这里,回过甚去,去看看鸿洋写的为RecyclerView打造通用Adapter 让RecyclerView加倍好用
注:这里不克不及供给现实项目代码,只能供给代码片段作为参考
。今朝暂未供给示例代码到github的项目中,只供给了recyclerView公用组件。
项目地址:MVPCommon

为RecyclerView打造通用Adapter 让RecyclerView加倍好用
RecyclerView手艺栈
返回顶部快速回复上一主题下一主题返回列表

声远论坛|联系电话:0537-2311005|Archiver|手机版|小黑屋|Sitemap|声远网 |网站地图|网站地图

鲁公网安备 37089702000485号 | 鲁ICP备 18028751号 | 互联网药品信息服务资格证:(鲁)-经营性-2022-0209 | 增值电信业务经营许可证:鲁B2-20230761号 | (鲁)职介证字[223]:第08120014号

中国互联网违法和不良信息举报中心 | 山东省互联网违法和不良信息举报中心 | 人工智能生成合成内容标识办法

GMT+8, 2026-5-6 14:33, Processed in 0.101635 second(s), 32 queries , Gzip On, APCu On.

Powered by Discuz! X3.5© 2001-2026 SYUAN.COM

快速回复 返回顶部 返回列表