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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章