RecyclerView添加Header(头布局)+无限轮播

本文提供了RecyclerView添加Header(头布局)和实现无限轮播的教程。通过修改PagerAdapter的getCount、instantiateItem和destroyItem方法实现无限轮播,并使用计时器进行定时切换。同时,参考相关资源创建BaseRecyclerAdapter作为RecyclerView的基础Adapter,使用WrapAdapter来添加Header,通过这两个自定义Adapter完成头布局的添加。

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

Demo下载地址:http://download.csdn.net/detail/u013091087/9538055
参考的项目地址:http://www.eoeandroid.com/thread-918398-1-1.html?_dsign=afb0ddb9
这里写图片描述
无限轮播:
主要是PagerAdapter的getCount,instantiateItem和destroyItem三个方法上处理就好,另外写一个计时器给viewpager定时切换即可。
pageradapter:

import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import java.util.List;

/**
 * Created by Coffee on 2016/5/28 0028.
 */
public class AdvertisePagerViewAdapter extends PagerAdapter {

    private List<ImageView> adver_images;

    public AdvertisePagerViewAdapter(List<ImageView> adver_images) {
        this.adver_images = adver_images;
    }

    @Override
    public int getCount() {
        // 设置有21亿+张广告数量(实际上只有adver_images.size()张)
        return Integer.MAX_VALUE;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        ImageView view = adver_images.get(position % adver_images.size());
        container.addView(view);// 将view加入到viewPager中,这句很重要
        return view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }
}

定时器:

private Handler mAdvertiseHandler = new Handler() {
        public void handleMessage(Message msg) {        
        mAdverViewpager.setCurrentItem(mAdverViewpager.getCurrentItem() + 1);
            // 每隔三秒发送一次
            mAdvertiseHandler.sendEmptyMessageDelayed(0, 3000);
        }
    };

在初始化viewpager之后,将广告设置在第一亿多就好,以免往回滑动碰到边界而崩溃。

 //默认在1亿多
        mAdverViewpager.setCurrentItem(Integer.MAX_VALUE / 2 - ((Integer.MAX_VALUE / 2) % adver_images.size()));
        //3秒定时
        mAdvertiseHandler.sendEmptyMessageDelayed(0, 2000);

RecyclerView添加Header(头布局):
参考于:http://www.eoeandroid.com/thread-918398-1-1.html?_dsign=afb0ddb9
主要是以下2个类BaseRecyclerAdapter,WrapAdapter
BaseRecyclerAdapter是RecyclerView的Adapter基类
1、自己准备数据,然后写一个adapter继承BaseRecyclerAdapter

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.jiaui.recyclerviewhaderdemo.R;
import com.jiaui.recyclerviewhaderdemo.bean.NewsBean;
import com.jiaui.recyclerviewhaderdemo.widget.BaseRecyclerAdapter;

import java.util.LinkedList;

public class NewsAdapter extends BaseRecyclerAdapter<NewsBean.News, NewsAdapter.MyViewHolder> {

    public NewsAdapter(Context context) {
        super(context);
    }

    public NewsAdapter(Context context, LinkedList mItemList) {
        super(context, mItemList);
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_news_recyclerview, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {

        NewsBean.News News = mItemLists.get(position);
        // 新闻图片
        Glide.with(mContext).load(News.getResId()).into(holder.image);
        holder.title.setText(News.getTitle());
        holder.count.setText(News.getCount() + "");
        holder.time.setText(News.getTime());
        holder.position = position;

    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView title;
        ImageView image;
        TextView time;
        TextView count;
        LinearLayout adContent;
        int position;

        public MyViewHolder(View NewsView) {
            super(NewsView);
            title = (TextView) NewsView.findViewById(R.id.news_title);
            image = (ImageView) NewsView.findViewById(R.id.news_image);
            time = (TextView) NewsView.findViewById(R.id.news_time);
            count = (TextView) NewsView.findViewById(R.id.news_count);
            adContent = (LinearLayout) NewsView.findViewById(R.id.news_content);
        }
    }
}

2、adapter写好之后,当做参数给WrapAdapter实例化

 // 新闻适配器
 mNewsAdapter = new NewsAdapter(this, newsData);
 mWrapAdapter = new WrapAdapter<>(mNewsAdapter);
 // 设置头部占据一行
 mWrapAdapter.adjustSpanSize(mNewsRecyclerView);
 // 设置RecyclerView的数据适配器(适配器包装)
 mNewsRecyclerView.setAdapter(mWrapAdapter);
 // 添加头布局
 mWrapAdapter.addHeaderView(headerLayout);

至此就完成了。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值