为了账号安全,请及时绑定邮箱和手机立即绑定

不一样的RecyclerView优雅实现复杂列表布局

泥阿布 移动开发工程师
难度初级
时长 1小时34分
学习人数
综合评分9.70
31人评价 查看评价
9.7 内容实用
9.7 简洁易懂
9.7 逻辑清晰
  • getItemOffsets()
    查看全部
  • reclycler中各个item设置边界
    查看全部
  • recyclerview holder是保存view的单位,记录在recyclerview的基本信息
    查看全部
  • RecyclerView实现多数据类型的list和grid混编 4.三个ViewHolder的改造 ViewHolder的bindViewHolder()会讲viewHolder的控件成员和对应位置的数据绑定,但是现在有三种不同的数据类型,如何解决? (1)三种数据ViewHolder继承RecyclerView.ViewHolder,各自实现 在onBindViewHolder()中根据不同viewType绑定不同的数据 (2)还是抽象一个ViewHolder,用T范型 public abstract class AbstractViewHolder<T> extends RecyclerView.ViewHolder{ public AbstractViewHolder(View itemView) { super(itemView); } public abstract void bindViewHolder(T dataModel); } 5.Adapter的改造 (1)getItemCount()和getItemViewType() 由于mTypes根据位置存放了所有数据的类型,所以可以直接从mTypes获取 public int getItemViewType(int position) { return mTypes.get(position); } (2)onCreateViewHolder() onBindViewHolder() 如图,需要说明: int realPosition = position - mFirstPositions.get(viewType); 是从每个list中取出item在它对应的数据列表的真实位置,这样可以拿出item的数据mList1.get(realPosition) 然后拿这个数据来和viewHolder的控件绑定 holder.bindViewHolder(mList1.get(realPosition));
    查看全部
  • RecyclerView实现多数据类型的list和grid混编 1.原理 如果每个item是不同的布局,就会有多种数据类型,这样就需要定义多个不同的数据类型 比如 public class ItemDataModelTwo { int avatarColor; String name; String content; } 这三种数据类型有不同的布局,而且只有第三种类型的数据才会list编排,前面两种类类型的数据都是grid编排。这样就有三个不同的数据列表list 这样就需要为每个item数据标上它的类型,这样从对应的位置就能获得它的viewType,然后就可以在onCreateViewHolder()和onBindViewHolder()中根据不同viewType做不同操作。 2.初始化所有的数据 如图 3.把数据传递给adapter public void addList(List<ModelOne> list1, List<ModelTwo> list2, List<ModelThree> list3) { this.mList1 = list1; this.mList2 = list2; this.mList3 = list3; // 为三种类型的数据列表分别置顶type类型,并初始化每个列表的初始位置 addListByType(TYPE_ONE, list1); addListByType(TYPE_TWO, list2); addListByType(TYPE_THREE, list3); } private void addListByType(int type, List list) { mPositions.put(type, mTypes.size()); for (int i = 0; i < list.size(); i++) { mTypes.add(type); } } 说明:mTypes按照位置存放每个item的类型,所以它的size是全部数据的size mPositions存放三种数据列表的起始位置
    查看全部
  • Grid和List混排的recyclerView 1.原理 grid形式的RecyclerView一般都是一行有多列,但是list形式的可以看作是只有一列的grid形式。 2.实现 (1)为RecyclerView设置GridLayoutManager,可以指定列数 GridLayoutManager layoutManager = new GridLayoutManager(this, 2); mRecyclerView.setLayoutManager(layoutManager); (2)grid和list混合编排 grid形式下,如果将某一itemView设置为独占一行就可以了,这可以通过判断itemType来设置。比如本来是两列,让某一itemView占两列就是list形式 layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { int itemType = mRecyclerView.getAdapter().getItemViewType(position); if (ItemDataModel.TYPE_THREE == itemType) { return layoutManager.getSpanCount(); // 返回是总列数,独占全部列数 } else { return 1; } } }); 3.为每个itemView设置背景和间距 如图,说明: getItemOffsets()的view参数是itemView,通过它来获得每一行的LayoutParams layoutParams.getSpanSize() 获取itemView所占的列数 layoutParams.getSpanIndex() 获取当前itemView在第几列 视频中代码为grid形式一行两列的每个itemView设置了上下,左右20的间距
    查看全部
  • 多种样式的列表实现(下) 1.前面说要新建一个抽象ViewHolder,然后派生三个ViewHolder,如 public class TypeOneViewHolder extends AbstractViewHolder { public ImageView avatar; public TextView name; public TypeOneViewHolder(View itemView) { super(itemView); avatar = (ImageView) itemView.findViewById(R.id.avatar); name = (TextView) itemView.findViewById(R.id.name); } @Override public void bindViewHolder(ItemDataModel item) { avatar.setImageResource(item.getAvatarColor()); name.setText(item.getName()); } } 2.关键的adapter (1)和视频中不同,这里Adapter的范型是AbstractViewHolder public class DemoAdapter extends RecyclerView.Adapter<AbstractViewHolder>{ (2)onCreateViewHolder() 返回ViewHolder,ViewHolder是根据每个布局inflate出来的view来创建的 new TypeOneViewHolder(mInflater.inflate(R.layout.item_type_one, parent, false)); 然后根据不同布局类型viewType返回不同的ViewHolder,如图 (3)onBindViewHolder() ViewHolder的控件成员和对应的item数据绑定的过程,如图 3.最最关键的getItemViewType() 返回不同布局的viewType,onCreateViewHolder()会根据它来创建不同的viewHolder
    查看全部
  • 多种样式的列表实现 1.MainActivity的实现,主要看伪造数据的部分 如图,需要注意随机数生成: int type = ((int) (Math.random() * 3) + 1); Math.random()是0~1,(Math.random() * 3)就是0~3,强转int就是0,1,2,所以((int) (Math.random() * 3) + 1)就是1,2,3,最后(type + 1) % 3就是2,0,1 2.根据三个不同显示情况设计ItemDataModel,这个类的成员是每个itemView中要显示数据的数据源 public class ItemDataModel { public static final int TYPE_ONE = 1; public static final int TYPE_TWO = 2; public static final int TYPE_THREE = 3; public int type; public int avatarColor; public String name; public String content; public int contentColor; 3.三种不同布局的ViewHolder ViewHolder包含了每个itemView中所有的控件,因为这里是三个不同的布局,且相差不大,所以定义一个抽象ViewHolder,再来派生三个ViewHolder。 RecyclerView的Adapter中有两个重要重写方法onCreateViewHolder(),onBindViewHolder() 前者需要返回创建的ViewHolder,后者需要为ViewHolder的控件成员设置要显示的数据。 public abstract class AbstractViewHolder extends RecyclerView.ViewHolder{ public AbstractViewHolder(View itemView) { super(itemView); } public abstract void bindViewHolder(ItemDataModel item); }
    查看全部
  • 基础知识 1.RecyclerView.Recycler 如图,多个RecyclerView共用一个缓存池,RecycleredPool。可以配置缓存池的size
    查看全部
  • 简介 1.RecyclerView的关键成员 (1)getItemViewType(int position) 根据不同位置返回不同的类型 (2)RecyclerView.ViewHolder 类似于listview的viewholder,每个item view中所以控件成员。RecyclerView中不再需要创建,只需要继承。 (3)RecyclerView.Recycler 缓存机制,可以看一下listview的covertView,不需要再处理缓存。 2.数据处理 如图 3.RecyclerView显示流程 比如滑动列表时,滚动->调用getItemViewType(position)根据position获取holder->如果为空,调用onCreateViewHolder(),否则调用onBindViewHolder() itemType是保存在viewHolder(继承RecyclerView.ViewHolder)中的,viewHolder是对应于position的,缓存在cache中。 public void onBindViewHolder(final MyViewHolder holder, int position) 当显示需要复用时,从cache中取holder来显示。所以看起来比较流畅。 4.RecyclerView.ViewHolder 这里面包含了所有的view,除此之外,还有position,itemType,是否被缓存的flag等基本信息 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
    查看全部
  • 分别从list种拿数据
    查看全部
  • 怎么取不同集合数据
    查看全部

举报

0/150
提交
取消
课程须知
需掌握安卓基本四大组件的基础知识,特别是ListView和GridView的用法
老师告诉你能学到什么?
学习这门课后可以更简单快捷的完成一些复杂列表布局的实现 慕课网Android讨论群② 170368200

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!