前情提要:去面试一家外企,需求是要重复使用一个布局很多次,单单是布局的话用include就可以了,但是逻辑也要复用,而且提出了使用listview复用条目优化性能,想做成一个自定义控件。我尝试了下,感觉直接用recycleview应该也是可以的。

效果展示

效果

实现思路


  1. 添加依赖
    com.android.support:recyclerview-v7:24.2.0
  2. 根据需求创建三个不同类型的item对应的布局文件
  3. 为每个类型的item创建数据bean类
  4. 创建通用的item数据bean类
  5. 为每个类型的item创建viewholder
  6. 创建Adapter类
  7. 在Activity使用recycleview

1.创建不同的item布局文件


  • 包括一个编辑框子项,一个按钮子项,一个下拉列表子项。
    布局文件就不放出来了,类似模仿下就可以。源代码项目中有。

2. 为每个类型的item创建数据bean类


  • 封装了每个item需要赋值的数据。

3. 创建通用的item数据bean类


  • 我们需要一个通用的数据项RecycleViewItemData来方便我们使用和进行子项的类型判断。
public class RecycleViewItemData<T> {//用来装载不同类型的item数据beanT t;//item数据bean的类型int dataType;public RecycleViewItemData () {}public RecycleViewItemData (T t, int dataType) {this.t = t;this.dataType = dataType;}public T getT () {return t;}public void setT (T t) {this.t = t;}public int getDataType () {return dataType;}public void setDataType (int dataType) {this.dataType = dataType;}
}

3. 为每个类型的item创建viewholder


  1. EditViewHolder

    public class EditViewHolder extends RecyclerView.ViewHolder {public TextView mTextView1;public TextView mTextView2;public EditText mEditText1;public EditText mEditText2;public EditViewHolder(View itemView) {super(itemView);mTextView1 = (TextView) itemView.findViewById(R.id.text1);mTextView2 = (TextView) itemView.findViewById(R.id.text2);mEditText1 = (EditText) itemView.findViewById(R.id.editText1);mEditText2 = (EditText) itemView.findViewById(R.id.editText2);}}
  2. SpinnerHolder
    public class SpinnerHolder extends RecyclerView.ViewHolder {public SpinnerHolder(View itemView) {super(itemView);}}

略。。。

4. 创建Adapter类


RecycleView的Adapter中需要重写方法的简单介绍

  • 构造方法:一般用于接收数据集
  • onCreateViewHolder:
    创建ViewHolder,该方法会在RecyclerView需要展示一个item的时候回调。重写该方法时,应该使ViewHolder加载item view的布局。
  • onBindeViewHolder:
    该方法在RecyclerView在特定位置展示数据时候回调。把数据绑定、填充到相应的item view中。
  • getItemCount
    返回数据的数量。
  • getItemViewType(int position) 注:需要时重写
    从这个方法中所返回的值会在onCreateViewHolder中用到。比如头部,尾部,等等的特殊itemView(这里说成ViewHolder比较好)都可以在这里进行判断。
public class Madapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {private static final int TYPE_EDIT = 0;//编辑框private static final int TYPE_BUTTON = 1;//按钮private static final int TYPE_SPINNER = 2;//下拉列表private ArrayList<RecycleViewItemData> dataList;//数据集合public Madapter(ArrayList<RecycleViewItemData> dataList) {this.dataList = dataList;}//用来创建ViewHolder@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {//如果viewType是编辑框类型,则创建EditViewHolder型viewholderif (viewType == TYPE_EDIT) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_creditcard_edit, parent, false);EditViewHolder viewHolder = new EditViewHolder(view);return viewHolder;}//如果viewType是按钮类型,则创建ButtonViewHolder型viewholderif (viewType == TYPE_BUTTON) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_creditcard_button, parent, false);ButtonViewHolder viewHolder = new ButtonViewHolder(view);return viewHolder;}//如果viewType是下拉列表类型,则创建SpinnerHolder型viewholderif (viewType == TYPE_SPINNER) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_creditcard_spinner, parent, false);SpinnerHolder viewHolder = new SpinnerHolder(view);return viewHolder;}return null;}//用来绑定数据@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {//如果holder是EditViewHolder的实例if (holder instanceof EditViewHolder) {//得到对应position的数据集EditItem mEditItem = (EditItem) dataList.get(position).getT();if (position == 0) {((EditViewHolder) holder).mTextView1.setText("* Holder Name");((EditViewHolder) holder).mTextView2.setText("* Card Number");} else if (position == 3) {((EditViewHolder) holder).mTextView1.setText("          * Street ");((EditViewHolder) holder).mTextView2.setText("           * City  ");} else if (position == 5) {((EditViewHolder) holder).mTextView1.setText("                   Or ");((EditViewHolder) holder).mTextView2.setText("           * Zipcode  ");}((EditViewHolder) holder).mEditText1.setText(mEditItem.getText1());((EditViewHolder) holder).mEditText2.setText(mEditItem.getText2());}//如果holder是ButtonViewHolder的实例if (holder instanceof ButtonViewHolder) {//从数据集合中取出该项ButtonItem mButtonItem = (ButtonItem) dataList.get(position).getT();//设置选中的按钮switch (mButtonItem.getPosition()) {case 0:((ButtonViewHolder) holder).mRadioButton.setChecked(true);break;case 1:((ButtonViewHolder) holder).mRadioButton2.setChecked(true);break;case 2:((ButtonViewHolder) holder).mRadioButton3.setChecked(true);break;}}//如果holder是SpinnerHolder的实例if (holder instanceof SpinnerHolder) {}}@Overridepublic int getItemViewType(int position) {if (0 == dataList.get(position).getDataType()) {return TYPE_EDIT;// 编辑框} else if (1 == dataList.get(position).getDataType()) {return TYPE_BUTTON;// 按钮} else if (2 == dataList.get(position).getDataType()) {return TYPE_SPINNER;//下拉列表} else {return 0;}}@Overridepublic int getItemCount() {return dataList.size();}
}

5. 在Activity使用recycleview


public class MainActivity extends AppCompatActivity {private ArrayList<RecycleViewItemData> dataList;@BindView(R.id.creditcard)RecyclerView mCreditcard;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.bind(this);mCreditcard.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));dataList=new ArrayList<RecycleViewItemData>();dataList.add(new RecycleViewItemData(new EditItem("aaa","bbb"),0));dataList.add(new RecycleViewItemData(new ButtonItem(1),1));dataList.add(new RecycleViewItemData(new SpinnerItem("aaa","bbb"),2));dataList.add(new RecycleViewItemData(new EditItem("aaa","bbb"),0));dataList.add(new RecycleViewItemData(new SpinnerItem("aaa","bbb"),2));dataList.add(new RecycleViewItemData(new EditItem("aaa","bbb"),0));mCreditcard.setAdapter(new Madapter(dataList));}
}

项目地址: https://github.com/whtchl/MultiItemRecycleView.git

转载地址:

http://www.jianshu.com/p/05dd0315ef41

http://blog.csdn.net/qq199208/article/details/49386827

RecycleView加载不同类型的Item相关推荐

  1. Android插件化开发之动态加载的类型

    https://segmentfault.com/a/1190000005113493 基本信息 Author:kaedea GitHub:android-dynamical-loading 现在网络 ...

  2. GBase 8a 加载longblob类型数据的方法

    加载longblob类型数据的方法简介 longblob类型数据加载方法分为两种,一种是数据形式的加载,一种是文件形式的加载.加载longblob类型数据时,可以通过加载的table_fields参数 ...

  3. 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)...

    AsyncTask使用方法详情:http://www.cnblogs.com/zzw1994/p/4959949.html 下拉开源框架PullToRefresh使用方法和下载详情:http://ww ...

  4. mybatis开启二级缓存和懒加载,类型别名,类都简称

    SqlMapConfig.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE conf ...

  5. QML 地图修改插件源码(三),Map在Plugin中设置加载地图类型

    常用的地图种类分为交通图,地形图,卫星图等等,在QML的Map(以OSM地图为例)中提供activeMapType属性用于读取当前显示的地图类型(注意:该属性为只读属性,不能用于赋值),QML中地图的 ...

  6. 目标检测(3)—— 如何使用PyTorch加载COCO类型的数据集

    一.如何使用PyTorch加载COCO数据集 打开pytorch的官网 可以看到COCO数据集不提供下载 回顾json文件里面都有什么:"annotations"里面有" ...

  7. 动态加载子节点_简易数据分析 10 | Web Scraper 翻页—抓取「滚动加载」类型网页...

    这是简易数据分析系列的第 10 篇文章. 原文首发于博客园:简易数据分析 10. 友情提示:这一篇文章的内容较多,信息量比较大,希望大家学习的时候多看几遍. 我们在刷朋友圈刷微博的时候,总会强调一个『 ...

  8. div自动滚动_简易数据分析 10 | Web Scraper 翻页——抓取「滚动加载」类型网页

    这是简易数据分析系列的第 10 篇文章. 原文首发于博客园:简易数据分析 10. 友情提示:这一篇文章的内容较多,信息量比较大,希望大家学习的时候多看几遍. 我们在刷朋友圈刷微博的时候,总会强调一个『 ...

  9. webscraper多页爬取_Web Scraper 翻页——抓取「滚动加载」类型网页(Web Scraper 高级用法)| 简易数据分析 10...

    这是简易数据分析系列的第 10 篇文章. 友情提示:这一篇文章的内容较多,信息量比较大,希望大家学习的时候多看几遍. 我们在刷朋友圈刷微博的时候,总会强调一个『刷』字,因为看动态的时候,当把内容拉到屏 ...

最新文章

  1. Java NIO(New I/O)的三个属性position、limit、capacity
  2. Unity3D for iOS初级教程:Part 2/3
  3. 今天做了一个复杂的table
  4. java循环链表类_3、循环链表(java实现)
  5. 如何处理Android Studio 上面关于 update 和 commit 小箭头的消失
  6. CRM Interactive Report的UI设计
  7. mysql+after+commit_Spring事务aftercommit原理及实践
  8. timeval的时间转换成毫秒之后多大的数据类型可以装下
  9. 前端学习(2914):差值表达式的用法
  10. 2020,国产数据库崭露峥嵘的发轫之年
  11. AndroidUI 控件命名格式
  12. 美国纽约法院定于明年3月对BitMEX前高管进行审判
  13. JAVA 8 LIST<对象> 转换SET
  14. centos 低版本出现fatal: unable to access 'https://github.com/XXXX': SSL connect error
  15. 《Linux编程》学习笔记 ·002【Linux常用工具GCC、GDB、Make】
  16. /etc/udev/rules.d/10-usbstorage.rules
  17. Cookie和Session的关系(个人理解)
  18. C和指针 第十六章 标准函数库 本地跳转setjmp.h
  19. 深度优先搜索 - 最短路径
  20. 129个百度网盘资源搜索网站大全(建议收藏)

热门文章

  1. rose 2003 7.0_安卓微信7.0.17正式版更新:十大新鲜功能~
  2. 截取年月日在hana中怎么写_写完作业就不学了怎么办?焦虑中的家长不妨先低头看看...
  3. springboot 添加拦截器之后中文乱码_springboot中配置了拦截器后,拦截器无效的解决方案之一...
  4. python中sys用法_python中os和sys模块的区别与常用方法总结
  5. c语言 sysinfo_操作系统:内存分配(C语言 winapi)
  6. matlab光滑曲线连接散点图
  7. 线程不安全 静态变量_ArrayList线程不安全,JUC是如何处理的
  8. 2019 CES展上最受外媒体关注的中国机器人产品及技术
  9. 一台机器同时启动两个tomcat
  10. Web测试实践-任务进度-Day02