RecyclerView之实现添加轮播图

本文详细介绍了一种基于Banner库的轮播图实现方案,包括自定义Adapter、ViewHolder及图片加载逻辑,适用于Android应用开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现方式:将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,为了布局填充的数据与位置对齐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值