Android学习笔记之RecyclerView(二)-异布局Item实现

转载请注明出处
[我的博客]http://www.lostbug.com

话说上回提到RecyclerView的基本用法
[RecyclerView的基本用法]http://blog.csdn.net/rockan007/article/details/51645054
说到RecyclerView基本上是ListView,GridView的升级版

本文主要记录不同item布局的使用,体现其异常的灵活性

如果之前你用过ListView实现过此功能,那么你一定对下面这两个方法并不陌生

    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

    @Override
    public int getViewTypeCount() {
        return super.getViewTypeCount();
    }

其中

  • getItemViewType方法是用来获取当前项Item(position参数)是哪种类型的布局,
  • getViewTypeCount方法是用来获取当前listview总共有多少种类型的布局。

如果你用RecyclerView,你会发现getViewTypeCount这个方法没有了,只有一个getItemViewType方法,用法和listview没有任何区别,这里要注意的就是这个函数onCreateViewHolder(ViewGroup parent, int viewType)这里的第二个参数就是View的类型,可以根据这个类型判断去创建不同item的ViewHolder。

/**
 * www.lostbug.com
 * Created by admin on 2016/6/12.
 */
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context mContext;
    private ArrayList mData;
    private LayoutInflater mLayoutInflater;

    public static enum ITEM_TYPE {
        ITEM_TYPE_TOP_IMAGE,
        ITEM_TYPE_TEXT,
        ITEM_TYPE_RIGHT_IMAGE
    }

    public void setData(ArrayList data) {
        mData = data;
    }

    public RecyclerAdapter(Context context) {
        mContext = context;
        mLayoutInflater = LayoutInflater.from(context);
    }

    @Override
    public int getItemCount() {
        return mData == null ? 0 : mData.size();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ITEM_TYPE whichView = ITEM_TYPE.values()[viewType];
        switch (whichView) {
            case ITEM_TYPE_RIGHT_IMAGE:
                return new RightImageViewHolder(mLayoutInflater.inflate(R.layout.item_recycler_right_image, parent, false));

            case ITEM_TYPE_TEXT:
                return new NormalTextViewHolder(mLayoutInflater.inflate(R.layout.item_recycler,parent,false));

            case ITEM_TYPE_TOP_IMAGE:
                return  new TopImageViewHolder(mLayoutInflater.inflate(R.layout.item_recycler_top_image,parent,false));

            default:
                return null;
        }

    }

    @Override
    public int getItemViewType(int position) {
        switch (position%3){
            case 0:
                return ITEM_TYPE.ITEM_TYPE_RIGHT_IMAGE.ordinal();
            case 1:
                return ITEM_TYPE.ITEM_TYPE_TEXT.ordinal();
            case 2:
                return ITEM_TYPE.ITEM_TYPE_TOP_IMAGE.ordinal();
            default:
                return -1;
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
     if(holder instanceof TopImageViewHolder){
         ((TopImageViewHolder)holder).mTopImage.setImageResource(R.drawable.ic_favorite_red_400_18dp);
         ((TopImageViewHolder)holder).tv.setText((String)mData.get(position));
     }else if(holder instanceof RightImageViewHolder){
         ((RightImageViewHolder)holder).mRightImage.setImageResource(R.drawable.ic_pets_cyan_a200_18dp);
         ((RightImageViewHolder)holder).tv.setText((String)mData.get(position) );

     }else {
         ((NormalTextViewHolder)holder).tv.setText((String)mData.get(position));
     }

    }

    public static class NormalTextViewHolder extends RecyclerView.ViewHolder {
        TextView tv;

        public NormalTextViewHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.item_textView);
        }
    }

    public static class TopImageViewHolder extends RecyclerView.ViewHolder {
        ImageView mTopImage;
        TextView tv;

        public TopImageViewHolder(View itemView) {
            super(itemView);
            mTopImage=(ImageView) itemView.findViewById(R.id.item_topImage);
            tv=(TextView)itemView.findViewById(R.id.item_textView);

        }
    }

    public static class RightImageViewHolder extends RecyclerView.ViewHolder {
        ImageView mRightImage;
        TextView tv;
        public RightImageViewHolder(View itemView) {
            super(itemView);
            mRightImage=(ImageView)itemView.findViewById(R.id.item_rightView);
            tv=(TextView)itemView.findViewById(R.id.item_textView);
        }
    }
}

注:

  • HeaderView和BottomView也是可以通过这种方式来实现的
  • 篇幅限制,其中item_topImge之类就不贴代码了

效果图如下:
效果图

发布了37 篇原创文章 · 获赞 3 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章