转载请注明出处
[我的博客]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之类就不贴代码了
效果图如下: