轉載請註明出處
[我的博客]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之類就不貼代碼了
效果圖如下: