一、a.RecyclerView.Adapter关键继承函数
getItemViewType获取本item的View类型
getItemCount()获取item的个数
onCreateViewHolder创建ViewHolder,目的传入View
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View inflate = null;
switch (viewType) {
case DataModel.TYPE_ONE:
inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item_one, parent, false);
return new OneHolder(inflate);
case DataModel.TYPE_TWO:
inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item_two, parent, false);
return new TwoHolder(inflate);
case DataModel.TYPE_THREE:
inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item_three, parent, false);
return new ThreeHolder(inflate);
}
return null;
}
onBindViewHolder获取对应position数据Model,用来绑定View与数据Model
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
int viewType = getItemViewType(position);
int realPosition = position - mPositions.get(viewType);
Log.d("zm","realPosition:"+realPosition);
switch (viewType){
case TYPE_ONE:
((OneHolder)holder).onBindViewHolder(dataModels1.get(realPosition));
break;
case TYPE_TWO:
((TwoHolder)holder).onBindViewHolder(dataModels2.get(realPosition));
break;
case TYPE_THREE:
((ThreeHolder)holder).onBindViewHolder(dataModels3.get(realPosition));
break;
}
}
b.RecyclerView.ViewHolder 用来绑定View与数据Model
onBindViewHolder(T model);
c.RecyclerView.setLayoutManager 设置布局管理
RecyclerView 控件通过 setLayoutManager()
方法来设置布局管理器,这是使用 RecyclerView 必须的操作步骤。这个布局管理器分三种 LinearLayoutManager
、GridLayoutManager
、StaggeredGridLayoutManager
。
spanCount
:在创建 GridLayoutManager 对象的时候构造方法需要传入这个参数,也就是设置每行排列 item 个数。
spanSize
:在 setSpanSizeLookup() 方法中,这个方法返回的是当前位置的 item 跨度大小。
setSpanSizeLookup() 方法,我们主要使用这个方法来展示不同的 item 屏幕跨度。
final GridLayoutManager gl = new GridLayoutManager(getApplicationContext(), 2);
// id_recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(),LinearLayoutManager.VERTICAL,false));
gl.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if(id_recyclerView.getAdapter().getItemViewType(position)==DataModel.TYPE_TWO){
return gl.getSpanCount();//如果是两行模式,每行2个item
}else{
return 1;//其他每行1个
}
}
});
id_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!=gl.getSpanCount()){
if(spanIndex == 1){
outRect.left = 10;
}else{
outRect.right = 10;
}
}
}
});
id_recyclerView.setLayoutManager(gl);
d.RecyclerView.addItemDecoration 装饰item
首先我们假设绿色区域代表的是我们的内容,红色区域代表我们自己绘制的装饰,可以看到:
图1:代表了getItemOffsets(),可以实现类似padding的效果
图2:代表了onDraw(),可以实现类似绘制背景的效果,内容在上面
图3:代表了onDrawOver(),可以绘制在内容的上面,覆盖内容
具体请看https://www.jianshu.com/p/b46a4ff7c10a里面有详细解说这个怎样用。
二、BaseQuickAdapter第三方辅助Adapter
其他关键函数
notifyItemInserted
registerAdapterDataObserver
onViewAttachedToWindow
onViewDetachedFromWindow
BaseQuickAdapter构造单一模式
MultipleItemRvAdapter可以构造多个结构模式
MultipleItemRvAdapter extends BaseQuickAdapter extends RecyclerView.Adapter整个构造靠Provider
onCreateViewHolder ->onCreateDefViewHolder->Provider.getLayoutId()获取资源id来创建Holder
onBindViewHolder ->Provider.conver(holder,getItem(position))把holder和对应的数据传递到对应
public class TestHomeAdapter extends MultipleItemRvAdapter<TestBean, BaseViewHolder> {
//通栏商品大图片
public static final int TYPE_IMG = 100;
//通栏图文
public static final int TYPE_TEXT_AND_IMG = 200;
//通栏文本
public static final int TYPE_TEXT = 300;
//三列
public static final int TYPE_THREE_COLUMN = 400;
//通栏水平拖动
public static final int TYPE_HORIZONTAL_SCROLL = 500;
//通栏窄图片
public static final int TYPE_NARROW_IMG = 600;
//两列
public static final int TYPE_TWO_COLUMN = 700;
public TestHomeAdapter() {
super(null);
finishInitialize();
}
@Override
protected int getViewType(TestBean testBean) {
int type = testBean.getType();
if (type == 1) {
return TYPE_IMG;
} else if (type == 2) {
return TYPE_TEXT_AND_IMG;
} else if (type == 3) {
return TYPE_TEXT;
} else if (type == 4) {
return TYPE_THREE_COLUMN;
} else if (type == 5) {
return TYPE_HORIZONTAL_SCROLL;
} else if (type == 6) {
return TYPE_NARROW_IMG;
} else if (type == 7) {
return TYPE_TWO_COLUMN;
}
return 0;
}
@Override
public void registerItemProvider() {
//通栏商品大图片
mProviderDelegate.registerProvider(new ImgItemProvider());
//通栏图文
mProviderDelegate.registerProvider(new ImgAndTextItemProvider());
//通栏文本
mProviderDelegate.registerProvider(new TextItemProvider());
//三列图文
mProviderDelegate.registerProvider(new ThreeColumnItemProvider());
//通栏横向滑动
mProviderDelegate.registerProvider(new ScrollItemProvider());
//通栏窄图片
mProviderDelegate.registerProvider(new NarrowImgItemProvider());
//两列图文
mProviderDelegate.registerProvider(new TwoColumnItemProvider());
}
@Override
public void setOnLoadMoreListener(RequestLoadMoreListener requestLoadMoreListener, RecyclerView recyclerView) {
super.setOnLoadMoreListener(requestLoadMoreListener, recyclerView);
}
}
public class ThreeColumnItemProvider extends BaseItemProvider<TestBean, BaseViewHolder> {
@Override
public int viewType() {
return TestHomeAdapter.TYPE_THREE_COLUMN;
}
@Override
public int layout() {
return R.layout.app_item_home_three_column;
}
@Override
public void convert(BaseViewHolder helper, TestBean data, int position) {
helper.setText(R.id.item_tv, data.getGoodsName() + "");
Glide.with(mContext)
.load(data.getGoodsUrl())
.dontAnimate()
.into((AppCompatImageView) helper.getView(R.id.item_img));
}
}