一、项目简介
项目地址:https://github.com/zhangtiansimple/CarouselBanner
效果图:
二、技术选型
本开源项目采用RecycleView实现,由于一直轮播的关系,需要不断的加载下一页,借用RecyclerView的缓存机制,可以很好的实现内存的管理。
三、具体实现
1.基本布局
最外层采用FrameLayout作为根布局,然后使用RecyclerView填充满根FrameLayout,再使用LinearLayout作为指示器的容器,和RecyclerView一起加入到根布局里。
public class CarouselBanner extends FrameLayout {
...
private void init(Context context, @Nullable AttributeSet attrs){
...
mRecyclerView = new RecyclerView(context);
mLinearLayout = new LinearLayout(context);
...
LayoutParams viewGroupParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
LayoutParams linearLayoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
linearLayoutParams.gravity = Gravity.BOTTOM | gravity;
linearLayoutParams.setMargins(margin, margin, margin, margin);
addView(mRecyclerView, viewGroupParams);
addView(mLinearLayout, linearLayoutParams);
}
}
2.设置RecyclerView
先来看RecycleView的Adapter
public class CarouselAdapter extends RecyclerView.Adapter {
private List<Object> list;
private CarouselSwitchBannerListener listener;
private CarouselBannerClickListener clickListener;
CarouselAdapter(List<Object> list) {
this.list = list;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
AppCompatImageView imageView = new AppCompatImageView(parent.getContext());
RecyclerView.LayoutParams params = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PAREN