android 开发笔记 RecyclerView 水平多行列表加头加尾

RecyclerView 水平多行排列添加头和尾
这里写图片描述


import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

/**
 * Created by guanyueyun on 2016/11/17.
 */
public abstract class HeaderFooterRecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {


    private int verticalItem;//垂直item
    private int horizontalItem;//水平item
    private int verticalHeaderItem;//垂直时的头
    private int horizontalHeaderItem;//水平时头布局
    private int verticalFooterItem;//垂直时的尾
    private int horizontalFooterItem;//水平时的尾

    public void setVerticalItem(int verticalItem) {
        this.verticalItem = verticalItem;
    }

    public void setHorizontalItem(int horizontalItem) {
        this.horizontalItem = horizontalItem;
    }

    public void setVerticalHeaderItem(int verticalHeaderItem) {
        this.verticalHeaderItem = verticalHeaderItem;
    }

    public void setHorizontalHeaderItem(int horizontalHeaderItem) {
        this.horizontalHeaderItem = horizontalHeaderItem;
    }

    public void setVerticalFooterItem(int verticalFooterItem) {
        this.verticalFooterItem = verticalFooterItem;
    }

    public void setHorizontalFooterItem(int horizontalFooterItem) {
        this.horizontalFooterItem = horizontalFooterItem;
    }

    private int  mNowItemLayoutID;
    private int mNowHeaderLayoutID;
    private int mNowFooterLayoutID;


    public static final int TYPE_HEADER = 0;
    public static final int TYPE_FOOTER = 1;
    public static final int TYPE_NORMAL = 2;
    private static final String TAG = "HeaderRecyclerAdapter";
    protected List<T> mDataList;
    private Context mContext;

    public HeaderFooterRecyclerAdapter(List<T> dataList,RecyclerView recyclerView, int mItemLayoutId) {
        mDataList = dataList;
        mContext=recyclerView.getContext();
        mRecyclerView=recyclerView;

        if (mItemLayoutId==0){
            return;
        }
        verticalItem=mItemLayoutId;
        horizontalItem=mItemLayoutId;
    }

    RecyclerView mRecyclerView;

    private View mHeaderView;
    private View mFooterView;

    /**
     * 设置头布局
     * @param headerViewLayoutID
     */
    public void setHeaderView(int headerViewLayoutID) {
        dealHeaderFooterLayoutType();
        headerViewLayoutID=headerViewLayoutID==0?mNowHeaderLayoutID:headerViewLayoutID;
        /**注意  root view 为recycleview*/
        View headerView = LayoutInflater.from(mContext).inflate(headerViewLayoutID,mRecyclerView,false);
        mHeaderView = headerView;
        notifyItemInserted(0);
    }

    /**
     *设置头布局
     * @param headerView
     */
    public void setHeaderView(View headerView) {
        mHeaderView = headerView;
        notifyItemInserted(0);
    }

    /**
     * 获取头布局视图对象
     * @return
     */
    public View getHeaderView() {
        return mHeaderView;
    }

    /**
     * 设置尾布局
     * @param footerViewLayoutID
     */
    public void setFooterView(int footerViewLayoutID) {
        dealHeaderFooterLayoutType();
        footerViewLayoutID=footerViewLayoutID==0?mNowFooterLayoutID:footerViewLayoutID;
        View footerView = LayoutInflater.from(mContext).inflate(footerViewLayoutID,mRecyclerView,false);
        mFooterView = footerView;
        notifyItemInserted(getItemCount() - 1);
    }

    /**
     * 设置尾布局
     * @param footerView
     */
    public void setFooterView(View footerView) {
        mFooterView = footerView;
        notifyItemInserted(getItemCount() - 1);
    }

    /**
     * 获取尾布局对象
     * @return
     */
    public View getFooterView() {
        return mFooterView;
    }


    /**
     * 更新数据源
     * @param dataList
     */
    public void refreshDataList(List<T> dataList) {
        mDataList.clear();
        mDataList.addAll(dataList);
        notifyDataSetChanged();
    }

    /**
     * 数据源天加新数据
     * @param dataList
     */
    public void appendDataList(List<T> dataList) {
        mDataList.addAll(dataList);
        notifyDataSetChanged();
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);

        //为GridLayoutManager 合并头布局的跨度
        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager) {
            final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
            gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                /**
                 * 抽象方法  返回当前index位置的item所占用的跨度的数量
                 * ##单元格合并  就是相当于占据了设定列spanCount的数量
                 * ##不合并     就是相当于占据了原来1个跨度
                 *
                 * @param position
                 * @return
                 */
                @Override
                public int getSpanSize(int position) {
                    int i = (getItemViewType(position) == TYPE_HEADER || getItemViewType(position) == TYPE_FOOTER) ? gridLayoutManager.getSpanCount() : 1;
                    return i;
                }
            });
            //
            mNowItemLayoutID  = gridLayoutManager.getOrientation() == GridLayoutManager.HORIZONTAL
                    ? horizontalItem : verticalItem;
            //
        } else if (layoutManager instanceof StaggeredGridLayoutManager) {
            StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;
            mNowItemLayoutID = staggeredGridLayoutManager.getOrientation() == StaggeredGridLayoutManager.HORIZONTAL
                    ? horizontalItem : verticalItem;

        } else if (layoutManager instanceof LinearLayoutManager) {
            LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
            mNowItemLayoutID = linearLayoutManager.getOrientation() == LinearLayoutManager.HORIZONTAL
                    ?horizontalItem : verticalItem;

        }
    }

    @Override
    public int getItemViewType(int position) {
        if (mHeaderView != null && mFooterView != null) {
            if (position == 0) {
                return TYPE_HEADER;
            }
            if (position == getItemCount() - 1) {
                return TYPE_FOOTER;
            }
            return TYPE_NORMAL;
        } else if (mHeaderView != null) {
            if (position == 0) {
                return TYPE_HEADER;
            }
            return TYPE_NORMAL;
        } else if (mFooterView != null) {
            if (position == getItemCount() - 1) {
                return TYPE_FOOTER;
            }
            return TYPE_NORMAL;
        }
        return TYPE_NORMAL;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (mHeaderView != null && viewType == TYPE_HEADER) {
            return new HeaderFooterRecyclerViewHolder(mHeaderView);
        }
        if (mFooterView != null && viewType == TYPE_FOOTER) {
            return new HeaderFooterRecyclerViewHolder(mFooterView);
        }
        View view = LayoutInflater.from(parent.getContext()).inflate(mNowItemLayoutID, parent, false);
        return new HeaderFooterRecyclerViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {

        ViewGroup.LayoutParams vg_lp = viewHolder.itemView.getLayoutParams();
        if (vg_lp != null && vg_lp instanceof StaggeredGridLayoutManager.LayoutParams) {
            StaggeredGridLayoutManager.LayoutParams sglm_lp = (StaggeredGridLayoutManager.LayoutParams) vg_lp;
            if (getItemViewType(position) == TYPE_HEADER) {
                sglm_lp.setFullSpan(position == 0);
            }
            if (getItemViewType(position) == TYPE_FOOTER) {
                sglm_lp.setFullSpan(position == getItemCount() - 1);
            }

        }


        int itemType = getItemViewType(position);
        if (itemType == TYPE_HEADER || itemType == TYPE_FOOTER) {
            return;
        }

        int realPos = position;
        if (mHeaderView != null) {
            realPos = position - 1;
        }
       final int pos = realPos;

        final T data = mDataList.get(pos);
        onBindViewHolderInner(viewHolder, pos, data);

        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(onItemClickListener != null) {
                        onItemClickListener.onItemClick(v,pos, data);
                    }
                }
            });

    }

    public  void dealHeaderFooterLayoutType(){
        /**单独为HORIZONTAL 设置左侧的布局 右侧布局*/
        RecyclerView.LayoutManager layoutManager=mRecyclerView.getLayoutManager();
        if (layoutManager instanceof StaggeredGridLayoutManager){
            StaggeredGridLayoutManager staggeredGridLayoutManager= (StaggeredGridLayoutManager) layoutManager;
            mNowHeaderLayoutID=staggeredGridLayoutManager.getOrientation()==StaggeredGridLayoutManager.HORIZONTAL
                    ?horizontalHeaderItem :verticalHeaderItem;
            mNowFooterLayoutID=staggeredGridLayoutManager.getOrientation()==StaggeredGridLayoutManager.HORIZONTAL
                    ?horizontalFooterItem :verticalFooterItem;
        }else if (layoutManager instanceof GridLayoutManager){
            GridLayoutManager gridLayoutManager= (GridLayoutManager) layoutManager;
            mNowHeaderLayoutID=gridLayoutManager.getOrientation()==GridLayoutManager.HORIZONTAL
                    ?horizontalHeaderItem :verticalHeaderItem;
            mNowFooterLayoutID=gridLayoutManager.getOrientation()==GridLayoutManager.HORIZONTAL
                    ?horizontalFooterItem :verticalFooterItem;
        }else if (layoutManager instanceof LinearLayoutManager){
            LinearLayoutManager linearLayoutManager= (LinearLayoutManager) layoutManager;
            mNowHeaderLayoutID=linearLayoutManager.getOrientation()==LinearLayoutManager.HORIZONTAL
                    ?horizontalHeaderItem :verticalHeaderItem;
            mNowFooterLayoutID=linearLayoutManager.getOrientation()==LinearLayoutManager.HORIZONTAL
                    ?horizontalFooterItem :verticalFooterItem;
        }
    }

    public abstract void onBindViewHolderInner(RecyclerView.ViewHolder viewHolder, int realPosition, T data);

    @Override
    public int getItemCount() {
        if (mHeaderView != null && mFooterView != null) {
            return mDataList.size() + 1 + 1;
        } else if (mHeaderView != null) {
            return mDataList.size() + 1;
        } else if (mFooterView != null) {
            return mDataList.size() + 1;
        }
        return mDataList.size();
    }


    public  interface OnItemClickListener {
        void onItemClick(View itemView, int position, Object data);
    }

    private OnItemClickListener onItemClickListener;

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }


}

封装ViewHolder

package com.guanyueyun.mylook.adapter;

import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;

/**
 * 
 */
public class HeaderFooterRecyclerViewHolder extends RecyclerView.ViewHolder{

    private SparseArray<View> mViewSparseArray = new SparseArray<>();
    private View mItemView;

    public HeaderFooterRecyclerViewHolder(View itemView) {
        super(itemView);
        mItemView=itemView;
    }

    public <T extends View> T onBindView(int viewId) {
        View view = mViewSparseArray.get(viewId);
        if (view == null) {
            view = mItemView.findViewById(viewId);
            mViewSparseArray.put(viewId, view);
        }
        return (T) view;

    }
}

下面是自己适配器

package com.guanyueyun.mylook.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.widget.ImageView;
import android.widget.TextView;

import com.guanyueyun.mylook.R;
import com.guanyueyun.mylook.bean.GoodsListInfo;
import com.squareup.picasso.Picasso;

import java.util.List;

/**
 * Created by Administrator on 2016/11/17.
 */
public class HomeHeaderAdapter extends HeaderFooterRecyclerAdapter{

    private Context context;

    /**
     *
     * @param dataList  数据源
     * @param recyclerView
     * @param mItemLayoutId  item
     */
    public HomeHeaderAdapter(List dataList, RecyclerView recyclerView, int mItemLayoutId) {
        super(dataList, recyclerView, mItemLayoutId);
        //设置中间布局
        this.context = recyclerView.getContext();
    }

    @Override
    public void onBindViewHolderInner(RecyclerView.ViewHolder viewHolder, int position, Object data) {
        GoodsListInfo.SkuBean skuBean = (GoodsListInfo.SkuBean) mDataList.get(position);

        if(viewHolder instanceof HeaderFooterRecyclerViewHolder) {
            HeaderFooterRecyclerViewHolder holder= (HeaderFooterRecyclerViewHolder) viewHolder;
            ImageView itemIv=holder.onBindView(R.id.item_homegoodslist_item_iv);
            TextView itemtv=holder.onBindView(R.id.item_homegoodslist_item_tv);
            Picasso.with(context).load(skuBean.getImages().get(0).getUrl()).into(itemIv);
            itemtv.setText(skuBean.getPrice2().getValue_display());

        }
    }
}

接下来就是添加数据源添加头和尾

 RecyclerView recyclerView = holder.itemHomeGoodslistRecyclerview;
            LinearLayoutManager layoutManager = new LinearLayoutManager(context);
            //设置布局管理器  GridLayoutManager.HORIZONTAL
            recyclerView.setLayoutManager(new GridLayoutManager(context,2, GridLayoutManager.HORIZONTAL,false));

//            //设置为垂直布局,这也是默认的
//            layoutManager.setOrientation(OrientationHelper.HORIZONTAL);

            HomeGoodsListAdapter recycleAdapter = new HomeGoodsListAdapter(info.getSku(),context);

            HomeHeaderAdapter adapter = new HomeHeaderAdapter(info.getSku(),recyclerView,R.layout.item_homegoodslist_item);
            //设置头布局
            adapter.setHeaderView(R.layout.item_homegoodslist_header);
            View headerView = adapter.getHeaderView();//获取头布局视图对象
            ImageView headerViewIv = (ImageView) headerView.findViewById(R.id.item_home_selectd_header);
            Picasso.with(context).load(info.getSku().get(0).getImages().get(0).getUrl()).into(headerViewIv);
            //设置尾布局
//            adapter.setFooterView(R.layout.item_homegoodslist_header);
            //设置Adapter
            recyclerView.setAdapter(adapter);
            //设置增加或删除条目的动画
            recyclerView.setItemAnimator( new DefaultItemAnimator());
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RecyclerView是一个强大的Android视图容器,可以在横排多布局中显示长短不一的数据列表。使用RecyclerView,我们可以方便地创建一个可滚动的视图列表,并对每个列表项进高度自定义。 要实现横排多布局,我们需要使用RecyclerView的LayoutManager。其中,GridLayoutManager是一个可以将项目在网格中显示的LayoutManager。我们可以通过设置GridLayoutManager的spanCount属性来指定每显示的列数。 对于长短不一的数据列表,我们可以使用RecyclerView的Adapter来将每个数据项绑定到相应的视图项上。在Adapter的getItemCount()方法中,我们可以返回数据列表的长度。 在Adapter中,我们需要重写onCreateViewHolder()方法来创建视图项的布局。我们可以根据需要选择不同的布局文件,并通过LayoutInflater来生成视图项的View实例。 在Adapter的onBindViewHolder()方法中,我们可以为每个视图项设置数据。根据数据的长度和内容,我们可以根据需要调整每个视图项的布局。 最后,我们需要将LayoutManager和Adapter与RecyclerView关联,并将RecyclerView到相应的父容器中。通过调用RecyclerView的setLayoutManager()和setAdapter()方法,我们可以让RecyclerView显示出横排多布局,并展示出长短不一的数据列表。 综上所述,通过RecyclerView的LayoutManager和Adapter,我们可以轻松实现横排多布局并展示长短不一的数据列表。这为我们创建灵活且自定义的视图列表提供了强大的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值