做一个项目的主页面的时候,想要它呈现出来的效果,不单一,更丰富那就要使用多布局来展现出来,那么就要思考一个问题。他呈现的是多个布局,怎么才能展现出来不同的布局?逻辑很简单,通过设置几个flag,来表示这些布局当前显示的是哪个布局,接下来,和代码结合了解一下:
第一部分:有几个布局就写几个flag
public class MyRecycler extends RecyclerView.Adapter{
private Context context;
private HomeBean.ResultBean result;
private LayoutInflater layoutInflater;
public static final int banner = 0;//广告
public static final int chanel= 1;//频道
public static final int act=2;//活动
public static final int seckill=3;//秒杀
public static final int recommend=4;//推荐
public static final int hot=5;//热卖
private int currenType= banner;//当前显示
public MyRecycler(Context context, HomeBean.ResultBean result) {
this.context = context;
this.result = result;
layoutInflater=LayoutInflater.from(context);
}
第二部分:继承RecyclerViewAdapter重写的方法:
1.onCreateViewHolder():判断当前是第几个布局,返回当前的布局(你的布局的高度一定要是自定高度)
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType==banner){
return new bannerHolder(context,layoutInflater.inflate(R.layout.banner_item,null));
}else if (viewType==chanel){
return new MyViewHolder(context,layoutInflater.inflate(R.layout.channel_item,null));
}else if (viewType==act){
return new ActHolder(context,layoutInflater.inflate(R.layout.act_item,null));
}else if (viewType==seckill){
return new SeckillHolder(context,layoutInflater.inflate(R.layout.seckill_item,null));
}else if (viewType==recommend){
return new RecommendHolder(context,layoutInflater.inflate(R.layout.recommend_item,null));
}else if (viewType==hot){
return new HotHolder(context,layoutInflater.inflate(R.layout.hot_item,null));
}
return null;
}
2. onBindViewHolder(),根据对应的布局,传对应的数据:
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (getItemViewType(position)==banner){
bannerHolder bannerHolders= (bannerHolder) holder;
List<HomeBean.ResultBean.BannerInfoBean> banner_info = result.getBanner_info();
bannerHolders.setData(banner_info);
}else if (getItemViewType(position)==chanel){
MyViewHolder myViewHolder= (MyViewHolder) holder;
List<HomeBean.ResultBean.ChannelInfoBean> channel_info= result.getChannel_info();
myViewHolder.setData(channel_info);
}else if (getItemViewType(position)==act){
ActHolder actHolder= (ActHolder) holder;
List<HomeBean.ResultBean.ActInfoBean> act_info = result.getAct_info();
actHolder.setData(act_info);
}else if (getItemViewType(position)==seckill){
SeckillHolder seckillHolder= (SeckillHolder) holder;
HomeBean.ResultBean.SeckillInfoBean seckill_info = result.getSeckill_info();
seckillHolder.setData(seckill_info);
}else if (getItemViewType(position)==recommend){
RecommendHolder recommendHolder= (RecommendHolder) holder;
List<HomeBean.ResultBean.RecommendInfoBean> recommend_info = result.getRecommend_info();
recommendHolder.setData(recommend_info);
}else if (getItemViewType(position)==hot){
HotHolder hotHolder= (HotHolder) holder;
List<HomeBean.ResultBean.HotInfoBean> hot_info = result.getHot_info();
hotHolder.setData(hot_info);
}
}
3. getItemViewType()item类型
/**
* item类型:
* @param position
* @return
*/
@Override
public int getItemViewType(int position) {
switch (position) {
case banner:
currenType = banner;
break;
case chanel:
currenType = chanel;
break;
case act:
currenType = act;
break;
case seckill:
currenType = seckill;
break;
case recommend:
currenType = recommend;
break;
case hot:
currenType = hot;
break;
}
return currenType;
}
4.getitemcount()这里的个数,一定要满足你要实现的布局个数,不匹配就会报空指针的错误!
/**
* item的总个数:
* @return
*/
@Override
public int getItemCount() {
return 6;
}
第二部分:进行适配:在这里使用网格布局,显示成垂直一列:
GridLayoutManager gridLayoutManager=new GridLayoutManager(getActivity(),1);
rv.setLayoutManager(gridLayoutManager);
MyRecycler recycler=new MyRecycler(getActivity(),result);
rv.setAdapter(recycler);
第三部分:进行细节功能的操作:
1.设置一个小控件,当超过三个布局自动隐藏:
//设置跨度监听事件:
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (position<=3){
//隐藏:
top.setVisibility(View.GONE);
}else {
//显示:
top.setVisibility(View.VISIBLE);
}
//只能返回1
return 1;
}
});
2.以及置顶功能:
//置顶监听;
image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rv.scrollToPosition(0);
}
});
最终效果如下: