登录 立即注册
安币:

利用 RecyclerView 的 ViewType 使用多种布局

[复制链接]
来自: MrlLee 分类: Android精品源码 上传时间: 2016-7-26 12:04:56
Tag:
立即下载
收藏

项目介绍:

CommonAdapter 在 0.4 版本中加入了 RecyclerView 里 viewType 的支持,这里演示使用它借助 viewType 实现 RecyclerView 的多种布局。
主要原理

直接使用 RecyclerView 来实现 ViewType 时,需要做这样几件事:

  • 定义 N 种 ViewType 常量
  • 定义 N 个 ViewHolder(继承 RecyclerView.ViewHolder)
  • 在 OnCreateHolder 中重写创建 holder 的逻辑,也就是从 viewType 到 holder 的映射
  • 在 getItemViewType 中重写获得 ViewType 的逻辑,也就是从 item(实体)或者 position 到 viewType 的映射

在 CommonAdapter 中,对这个逻辑进行了简化,因为 viewType 的最终目的就是完成从实体或者位置到 Holder 的映射,所以在 CommonAdapter 中只需要做两件事:

  • 定义 N 中 ViewHolder(继承 CommonHolder)
  • 实现 ViewTypeMapper 接口(从 Item 或者 position 到 holder 的映射)

实现原理其实是使用了 viewHolder 的 class 对象的 hashCode 当做了 viewType,因为这样完全满足 ViewType 使用时的要求,又减少了多余的定义。

这里写了一个小例子,在一个 RecyclerView 中,有两种类型的数据,它们分别是文章(Article)和(照片)。它们分别使用不同的布局并且定了不同的 ViewHolder(这里继承的是 CommonHolder)

核心代码
[Java] 查看源文件 复制代码
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

MultiTypeAdapter adapter = new MultiTypeAdapter(this, new ViewTypeMapper() {
    @Override
    public Class> getViewType(ViewTypeItem item, int position) {
        // 指定哪个数据对应哪个 ViewHolder
        if (item instanceof Article) return ArticleHolder.class;
        if (item instanceof Photo) return PhotoHolder.class;
        return null;
    }
});

recyclerView.setAdapter(adapter);

定义两个ViewHolder,继承 CommonHolder,其中的泛型应该为实现了 ViewTypeItem 接口的实体类型,比如这里的 Article 和 Photo:

  • ArticleHolder.java
    [Java] 查看源文件 复制代码
    @LayoutId(R.layout.item_article)
    public class ArticleHolder extends CommonHolder
    { @ViewId(R.id.textTitle) public TextView textTitle; @ViewId(R.id.textContent) public TextView textContent; public ArticleHolder(View itemView) { super(itemView); } @Override public void bindData(Article article) { textTitle.setText(article.title); textContent.setText(article.content); } }

  • PhotoHolder.java
    [Java] 查看源文件 复制代码
    @LayoutId(R.layout.item_photo)
    public class PhotoHolder extends CommonHolder {
    
        @ViewId(R.id.imagePicture) ImageView imagePicture;
        @ViewId(R.id.textDesc)     TextView  textDesc;
    
        public PhotoHolder(View itemView) {
            super(itemView);
        }
    
        @Override public void bindData(Photo photo) {
            Context context = getItemView().getContext();
            imagePicture.setImageDrawable(ContextCompat.getDrawable(context, photo.photoId));
            textDesc.setText(photo.description);
        }
    }



相关源码推荐:

我来说两句
所有评论(67)
Vension 2016-7-26 12:14:16
精华内容,楼主V5!
回复
Mr_Zhao 2016-7-26 12:22:13
写的真的很不错
回复
孙林 2016-7-26 12:51:58
感谢分享,安卓巴士有你更精彩:)
回复
myself2015 2016-7-26 13:06:36
apkbus好的内容真的很多~赞
回复
li229565 2016-7-26 13:16:06
感谢分享,安卓巴士有你更精彩:)
回复
ILI 2016-7-26 14:05:07
好好 学习了 确实不错
回复
fan0424 2016-7-26 14:12:17
感谢分享,安卓巴士有你更精彩:)
回复
上传代码
查看数:4953 收藏数:10 下载数:55 点赞数:0
状态:已购或VIP 售价:10(原价:10)金钱 下载权限:初级码农 
代码贡献英雄榜
用户名 下载数
联系我们
首页/微信公众账号投稿

帖子代码编辑/版权问题

QQ:435399051,769657487

如何获得代码达人称号

如何成为签约作者

联系我们
关闭
合作电话:
15618560077
Email:
805941275@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

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