实现方式:将item 0返回轮播图即可。
第三方框架:Banner implementation 'com.youth.banner:banner:2.1.0'
Banner的详细使用:
①:VodBannerAdapter:
注意:onCreateHolder是,布局需要设置为match_parent,这个是viewpager2强制要求的itemView.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
public class VodBannerAdapter extends BannerAdapter<ChannelVodBean, VodBannerAdapter.BannerViewHolder> {
public VodBannerAdapter(List<ChannelVodBean> data) {
super(data);
}
@Override
public BannerViewHolder onCreateHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_vod_banner, parent, false);
//注意,必须设置为match_parent,这个是viewpager2强制要求的
itemView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
return new BannerViewHolder(itemView);
}
@Override
public void onBindView(BannerViewHolder holder, ChannelVodBean channelVodBean, int position, int size) {
// http://mavis-newpop-test.fasaxy.com/newpop/
Logger.i(Logger._TJ, "onBindView url: " + RequestApi.CMS_MAVIS_URL + channelVodBean.getImg());
Glide.with(holder.mImageView)
.load(RequestApi.CMS_MAVIS_URL + "/" + channelVodBean.getImg())
.fitCenter()
.placeholder(R.mipmap.poster_default)
.into(holder.mImageView);
holder.mTextView.setText(channelVodBean.getName());
}
class BannerViewHolder extends RecyclerView.ViewHolder {
ImageView mImageView;
TextView mTextView;
public BannerViewHolder(@NonNull View view) {
super(view);
mImageView = view.findViewById(R.id.banner_iv);
mTextView = view.findViewById(R.id.banner_tv);
}
}
}
②使用
mBannerAdapter = new VodBannerAdapter(bannerList);
mBanner.addBannerLifecycleObserver(homeFragment)
.setAdapter(mBannerAdapter)
.setIndicator(new CircleIndicator(itemView.getContext()));
mBannerAdapter.setOnBannerListener(new OnBannerListener() {
@Override
public void OnBannerClick(Object data, int position) {
mIOnItemClickListener.onBannerItemClick((ChannelVodBean) data);
}
});
item_vod_banner.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="@dimen/_360px_in720p">
<ImageView
android:id="@+id/banner_iv"
android:layout_width="match_parent"
android:layout_height="@dimen/_360px_in720p"
android:background="@mipmap/vod_poster"
app:layout_constraintTop_toTopOf="parent"/>
<TextView
android:id="@+id/banner_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/_10px_in720p"
android:layout_marginStart="@dimen/_20px_in720p"
android:textColor="@color/color_white"
android:textSize="@dimen/_24px_in720p"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
这里,Banner初步实现,但需要将这个放入到一个整体的RecyclerView中,才能实现联动滑动。
下面,给详细的外部RecyclerView的Adapter
package iptv.com.quick.adapter;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.youth.banner.Banner;
import com.youth.banner.indicator.CircleIndicator;
import com.youth.banner.listener.OnBannerListener;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import iptv.com.quick.R;
import iptv.com.quick.api.RequestApi;
import iptv.com.quick.bean.CategoryBean;
import iptv.com.quick.bean.ChannelVodBean;
import iptv.com.quick.module.base.BaseFragment;
import iptv.com.quick.utils.Logger;
/**
* ================================================
* 作 者:zhoujianan
* 版 本:v1.0
* 创建日期:2020/7/13
* 描 述:
* 修订历史:
* ================================================
*/
public class VodCategoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG = "VodCategoryAdapter";
private List<CategoryBean> mCategoryList;
private BaseFragment homeFragment;
public static final int BINDER_VIEW = 0x00000111;
public List<ChannelVodBean> bannerList;
public VodCategoryAdapter(BaseFragment home) {
homeFragment = home;
mCategoryList = new ArrayList<>();
bannerList = new ArrayList<>();
}
public void updateCategoryList(List<CategoryBean> list) {
mCategoryList.addAll(list);
notifyDataSetChanged();
}
public void updateBannerList(List<ChannelVodBean> list) {
mCategoryList.add(0,null);
bannerList = list;
notifyItemChanged(0);
notifyItemChanged(1);
}
public List<CategoryBean> getCategoryList() {
return mCategoryList;
}
@Override
public int getItemViewType(int position) {
if (position == 0 && bannerList.size() > 0) {
return BINDER_VIEW;
} else {
return super.getItemViewType(position);
}
}
@Override
public int getItemCount() {
return mCategoryList == null ? 0 : mCategoryList.size();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == BINDER_VIEW) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.category_banner, parent, false);
BannerViewHolder bannerViewHolder = new BannerViewHolder(view);
bannerViewHolder.setFragment(homeFragment);
bannerViewHolder.setOnClickListener(mBannerClickListener);
return bannerViewHolder;
} else {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_vod_category, parent, false);
DefViewHolder defViewHolder = new DefViewHolder(view);
defViewHolder.setOnClickListener(mItemClickListener);
defViewHolder.setRequestChannelListener(mIRequestChannelListener);
return defViewHolder;
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
Logger.i(Logger._TJ, "onBindViewHolder: " + position + " type: " + getItemViewType(position));
if (getItemViewType(position) == BINDER_VIEW) {
BannerViewHolder bannerViewHolder = (BannerViewHolder) holder;
bannerViewHolder.setData(bannerList);
} else {
DefViewHolder defHolder = (DefViewHolder) holder;
defHolder.setData(mCategoryList.get(position));
}
}
public static class DefViewHolder extends RecyclerView.ViewHolder {
private TextView mCategoryTv;
private ImageView mRefreshIv;
private ImageView mIntoIv;
public String mCategoryId;
private List<View> channelListView;
private List<ChannelVodBean> channelListBean;
private IOnItemClickListener mCategoryListener;
public IRequestChannelListener mChannelRequestListener;
public DefViewHolder(@NonNull View itemView) {
super(itemView);
mCategoryTv = itemView.findViewById(R.id.vod_sort_name_tv);
mRefreshIv = itemView.findViewById(R.id.refresh_iv);
mIntoIv = itemView.findViewById(R.id.into_iv);
channelListView = new ArrayList<>();
channelListView.add(itemView.findViewById(R.id.channelView1));
channelListView.add(itemView.findViewById(R.id.channelView2));
channelListView.add(itemView.findViewById(R.id.channelView3));
channelListView.add(itemView.findViewById(R.id.channelView4));
channelListView.add(itemView.findViewById(R.id.channelView5));
for (int i = 0; i < channelListView.size(); i++) {
final int channelIndex = i;
channelListView.get(i).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mCategoryListener.onChannelItemClick(getItemBean(channelIndex));
}
});
}
mCategoryTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mCategoryListener.onCategoryItemClick(getLayoutPosition());
}
});
DefViewHolder mDefViewHolder = this;
mRefreshIv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Animation mRefreshAnim = AnimationUtils.loadAnimation(v.getContext(), R.anim.detail_refresh);
mRefreshIv.startAnimation(mRefreshAnim);
mChannelRequestListener.requestChannel(mDefViewHolder, getLayoutPosition());
}
});
}
public interface IRequestChannelListener {
void requestChannel(DefViewHolder holder, int position);
}
public void setRequestChannelListener(IRequestChannelListener listener) {
mChannelRequestListener = listener;
}
public interface IOnItemClickListener {
void onCategoryItemClick(int position);
void onChannelItemClick(ChannelVodBean channelVodBean);
}
public void setOnClickListener(IOnItemClickListener itemClickListener) {
mCategoryListener = itemClickListener;
}
public void setData(CategoryBean data) {
if (data == null) {
return;
}
mCategoryTv.setText(data.getName());
mCategoryId = data.getId();
setChannelData(data.getChannelList());
}
}
public static class BannerViewHolder extends RecyclerView.ViewHolder {
private VodBannerAdapter mBannerAdapter;
private List<ChannelVodBean> bannerList = new ArrayList<>();
private Banner mBanner;
private BaseFragment homeFragment;
private IOnItemClickListener mIOnItemClickListener;
public BannerViewHolder(@NonNull View itemView) {
super(itemView);
mBanner = (Banner) itemView;
mBannerAdapter = new VodBannerAdapter(bannerList);
mBanner.addBannerLifecycleObserver(homeFragment)
.setAdapter(mBannerAdapter)
.setIndicator(new CircleIndicator(itemView.getContext()));
mBannerAdapter.setOnBannerListener(new OnBannerListener() {
@Override
public void OnBannerClick(Object data, int position) {
mIOnItemClickListener.onBannerItemClick((ChannelVodBean) data);
}
});
}
public interface IOnItemClickListener {
void onBannerItemClick(ChannelVodBean channelVodBean);
}
public void setOnClickListener(IOnItemClickListener itemClickListener) {
mIOnItemClickListener = itemClickListener;
}
public void setData(List<ChannelVodBean> list) {
bannerList.clear();
bannerList.addAll(list);
mBannerAdapter.notifyDataSetChanged();
}
public void setFragment(BaseFragment activity) {
homeFragment = activity;
}
}
private DefViewHolder.IRequestChannelListener mIRequestChannelListener;
public void setOnItemChannelRequestListener(DefViewHolder.IRequestChannelListener listener) {
mIRequestChannelListener = listener;
}
private DefViewHolder.IOnItemClickListener mItemClickListener;
public void setOnItemClickedListener(DefViewHolder.IOnItemClickListener listener) {
mItemClickListener = listener;
}
private BannerViewHolder.IOnItemClickListener mBannerClickListener;
public void setOnBannerItemClickedListener(BannerViewHolder.IOnItemClickListener onItemClickListener) {
mBannerClickListener = onItemClickListener;
}
}
注意两点:
一:getViewType:动态添加布局,是否有BannerList数据,有的话,返回BannerView,没有,就是正常的布局
二:getLayoutPosition:如果有Banner布局,这个值返回的位置,则从1开始,所以,我在返回banner布局的时候,在0的位置添加了null,为了布局填充的数据与位置对齐。