设置RecyclerView 的间隔代码示例
RecyclerView.addItemDecoration(new RecyclerView.ItemDecoration(){
@override
public void getItemOffsets(Rect outRect,View view , RecyclerView parent, RecyclerView.State state){
GridLayoutManager.LayoutParams lp = (GridLayoutManager.LayoutParams) view.getLayoutParams();
int spanSize = lp.getSpanSize();
int spanIndex = lp.getSpanIndex();
outRect.top = 20;
if(spanSize != gridLayoutManager.getSpanCount()){
if(spanIndex ==1){ outRect.left = 10;}else{ outRect.right=10;}
}
}
});
GridLayoutManager.SpanSizeLookup的getSpanSize(int position)方法根据position 配个 RecyclerView的Adapter的getItemViewType(position)方法得到对应position的View类型,进而决定返回该View所应占用的SpanSize的大小:
public int getSpanSize(int position){
int type = mRecyclerView.getAdapter().getItemViewType(position);
if(type ==DataModel.TYPE_THREE){ return gridLayoutManager.getSpanCount();}
else { return 1;}
}
GridLayoutManager中的setSpanSizeLookup(GridLayoutManager.SpanSizeLookup)方法可以根据position返回每个Item占用几个Span;GridLayoutManager.SpanSizeLookup.getSpanSize(int position)
GridLayoutManager示例实现Grid与List混排
调试布局的时候,在开发者选项中可以打开显示布局边界
多种ViewHolder创建使用示例
配合三种Item布局,创建三种ViewHolder
技能点:TextView中用tools:text="",指定的text属性值,在布局预览中可以看到,但是在程序运行时是看不到的,达到预览的效果
创建三种类型的ItemView布局
RecyclerView 的Adapter中的getItemViewType(int position)代码示例
重点:
分配好getItemViewType(int position)中的Type;
type只需要时一个数字即可,不一定是连续的,但必须是唯一的
与ListView的区别
RecyclerView.Recycler:
多个RecyclerView共用一个RecycleredPool,
RecycleredPool为RecyclerView的静态成员变量
配置缓存Size
RecyclerView.Recycler:
RecyclerView通过内部类Recycler中的Map缓存了Holder
RecyclerView.Holder 在RecycleView中保存View,包装了View;
与ListView不同,ListView的cache中保存的是View,而RecyclerView的cache中保存的Holder,在Holder中包装了一个View;
Holder中保存着Type,Position,是否需要被缓存的Flag标志等信息
getItemType:
遍历缓存中的Holder,如果Type与所需要的一致就返回Holder
getItemType的作用
ItemType 保存在Holder中,holder根据position被缓存在cache中
RecyclerView支持多样Item布局的原理
笔记见截图
第一步:复写getitemviewType(int position)方法
根据各个position的位置返回不同的类别
第二部:处理get itemcount()
第三步:按照类型处理onCreateVIewHolder和onbindviewHolder
这两个方法就是原来listview当中adapter中需要复写的getview
recyclerView = (RecyclerView) findViewById(R.id.my_rv); GridLayoutManager manager = new GridLayoutManager(this, 6); manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { if (position < 7 || position > 14) { return 3; } return 2; } }); recyclerView.setLayoutManager(manager); adapter = new MyAdapter(this); recyclerView.setAdapter(adapter);作者:Android_小生链接:https://www.jianshu.com/p/29465cce1131來源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
对应博客
https://blog.csdn.net/qq_31568297/article/details/53468648
学习技巧:
学会看官方文档
多看源码
多写,多实践
优化自己的代码
设置适配器
都有同样的方法,做个抽象类出来