RecyclerView添加多个样式不同的Item布局

Posted changhaiSmile

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RecyclerView添加多个样式不同的Item布局相关的知识,希望对你有一定的参考价值。

RecyclerView加载一种Item显示,往往不能满足我们在项目中开发的需要,下面我来给大家演示一下RecyclerView如何给它添加多个布局文件

那么现在问题来了,这样实现的方式有很多种,1、通过RecyclerView中的Adapter中的getItemType();进行判断加载不的布局属于哪一种样式,

通过样式来加载,但是这儿就会写很多的代码,比如每一个viewHolder对应一种将被加载的布局,这样写起来的缺点是,加载耗时,浪费资源

今天我采用另外一种方式呈现给大家,希望给大家带来一定的帮助。详情请看代码:

public abstract class MoreHeaderRecyclerAdapter
        <HeaderHolder extends RecyclerView.ViewHolder, HeaderTHolder
                extends RecyclerView.ViewHolder, ItemHolder extends RecyclerView.ViewHolder> extends RecyclerView    .Adapter<RecyclerView.ViewHolder> 
    public static int TYPE_HEAD = 0;//头部
    public static int TYPE_HEAD_TWO = 1;
    public static int TYPE_ITEM = 2;
    public static int TYPE_FOOT = 3;
    public abstract HeaderHolder onCreateHeaderViewHolder(ViewGroup parent, int position);
    public abstract HeaderTHolder onCreateHeaderTViewHolder(ViewGroup parent, int position);
    public abstract ItemHolder onCreateItemViewHolder(ViewGroup parent, int position);
    public abstract void onBindHeaderViewHolder(HeaderHolder holder, int position);
    public abstract void onBindHeaderTViewHolder(HeaderTHolder holder, int position);
    public abstract void onBindItemHolderViewHolder(ItemHolder holder, int position);
    //第三部分和第二部分的接口回调函数
    public interface DetalisCallBack 
        void getDetalisData(int index, int position);
    
    public DetalisCallBack detalisCallBack;
    public DetalisCallBack getDetalisCallBack() 
        return detalisCallBack;
    
    public void setDetalisCallBack(DetalisCallBack detalisCallBack) 
        this.detalisCallBack = detalisCallBack;
    
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
        switch (viewType) 
            case 0:
                return onCreateHeaderViewHolder(parent, viewType);
            case 1:
                return onCreateHeaderTViewHolder(parent, viewType);
            default:
                return onCreateItemViewHolder(parent, viewType);
        
    

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) 
        int headerCount = getHeadViewCount();
        int headerTCount = getHeadTViewCount();
        int itemType = getItemViewType(position);
        switch (itemType) 
            case 0:
                onBindHeaderViewHolder((HeaderHolder) holder, position);
                break;
            case 1:
                onBindHeaderTViewHolder((HeaderTHolder) holder, position - headerCount);
                break;
            case 2:
                onBindItemHolderViewHolder((ItemHolder) holder, position - headerTCount - headerCount);
                break;
        
    

    public abstract int getHeadTViewCount();
    public abstract int getHeadViewCount();
    public abstract int getItemViewCount();
    @Override
    public int getItemCount() 
        return getItemViewCount() + getHeadTViewCount() + getHeadViewCount();
    
    @Override
    public int getItemViewType(int position) 
        int headerCount = getHeadViewCount();
        int headerTCount = getHeadTViewCount();
        if (position < headerCount) 
            return TYPE_HEAD;
        
        if (position <= headerTCount) 
            return TYPE_HEAD_TWO;
        
        return TYPE_ITEM;
    

下面我们一起来看看在activity或fragment中的使用:
MoreHeaderRecyclerAdapter adapter = new MoreHeaderRecyclerAdapter() 
            @Override
            public RecyclerView.ViewHolder onCreateHeaderViewHolder(ViewGroup parent, int position) 
              View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.public_item_viewpager, null);
              return new HeaderHolder(view);
            

            @Override
            public RecyclerView.ViewHolder onCreateHeaderTViewHolder(ViewGroup parent, int position) 
              View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.public_item_infos_two, null);
              return new HeaderTHolder(view);
            

            @Override
            public RecyclerView.ViewHolder onCreateItemViewHolder(ViewGroup parent, final int position) 
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.detalis_layout_item, null);
                return new ItemHolder(view);
            

            @Override
            public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder, int position) 
                HeaderHolder itemHolder = (HeaderHolder) holder;
                itemHolder.PmViewPager.setAdapter(infoPageAdapter);
                infoPageAdapter.UpDataUrl(dataUtils.initAdapterData(imageViews, urls, simpleDraweeViews, SimpleList, infoPageAdapter));
            

            @Override
            public void onBindHeaderTViewHolder(RecyclerView.ViewHolder holder, final int position) 
                HeaderTHolder tHolder = (HeaderTHolder) holder;
                tHolder.public_text_content.setText("订单详情");
                tHolder.alter.setText("详情");
                tHolder.LayoutRight.setOnClickListener(new View.OnClickListener() 
                    @Override
                    public void onClick(View v) 
                        if (adapter.detalisCallBack != null) 
                            adapter.detalisCallBack.getDetalisData(0, position);
                        
                    
                );
            

            @Override
            public void onBindItemHolderViewHolder(RecyclerView.ViewHolder holder, final int position) 
                ItemHolder itemHolder = (ItemHolder) holder;
                itemHolder.bossName.setText(list.get(position).getClientId());
                itemHolder.detalisSate.setText(list.get(position).getDetailsState());
                itemHolder.detalisType.setText(list.get(position).getDetailsType());
                itemHolder.detalisTime.setText(list.get(position).getOrdersTime());
                itemHolder.detallisNumber.setText(list.get(position).getDetailsNumber());
                itemHolder.itemView.setOnClickListener(new View.OnClickListener() 
                    @Override
                    public void onClick(View v) 
                        if (adapter.detalisCallBack != null) 
                            adapter.detalisCallBack.getDetalisData(1, position);
                        
                    
                );
            
            @Override
            public int getHeadTViewCount() 
                return 1;
            

            @Override
            public int getHeadViewCount() 
                return 1;
            

            @Override
            public int getItemViewCount() 
                return list.size();
            


以上是关于RecyclerView添加多个样式不同的Item布局的主要内容,如果未能解决你的问题,请参考以下文章

BRVAH(让RecyclerView变得更高效)

打造RecyclerView的n级列表

为RecyclerView的不同item项实现不同的布局(添加分类Header)

RecyclerView实现多种item布局-----学习

如何在recyclerview android中的single_row_item的每个视图(imageView,textView)上添加不同的点击事件?

Android RecyclerView使用简述