在上一篇(RecyclerView使用詳解(一))文章中簡單的介紹了RecyclerView的基本用法,接下來要來講講RecyclerView的更多用法,要實現不同的功能效果,大部分都還是在於RecyclerView的Adapter寫法,所以我們着重來看看幾種不同功能的Adapter寫法。
一、多Item佈局實現(MultipleItem)
如果之前你用過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。
public class MultipleItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static enum ITEM_TYPE {
ITEM_TYPE_IMAGE,
ITEM_TYPE_TEXT
}
private LayoutInflater mLayoutInflater;
private Context mContext;
private String[] mTitles;
public MultipleItemAdapter(Context context) {
mTitles = context.getResources().getStringArray(R.array.titles);
mContext = context;
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == ITEM_TYPE.ITEM_TYPE_IMAGE.ordinal()) {
return new ImageViewHolder(mLayoutInflater.inflate(R.layout.item_image, parent, false));
} else {
return new TextViewHolder(mLayoutInflater.inflate(R.layout.item_text, parent, false));
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof TextViewHolder) {
((TextViewHolder) holder).mTextView.setText(mTitles[position]);
} else if (holder instanceof ImageViewHolder) {
((ImageViewHolder) holder).mTextView.setText(mTitles[position]);
}
}
@Override
public int getItemViewType(int position) {
return position % 2 == 0 ? ITEM_TYPE.ITEM_TYPE_IMAGE.ordinal() : ITEM_TYPE.ITEM_TYPE_TEXT.ordinal();
}
@Override
public int getItemCount() {
return mTitles == null ? 0 : mTitles.length;
}
public static class TextViewHolder extends RecyclerView.ViewHolder {
@InjectView(R.id.text_view)
TextView mTextView;
TextViewHolder(View view) {
super(view);
ButterKnife.inject(this, view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("TextViewHolder", "onClick--> position = " + getPosition());
}
});
}
}
public static class ImageViewHolder extends RecyclerView.ViewHolder {
@InjectView(R.id.text_view)
TextView mTextView;
@InjectView(R.id.image_view)
ImageView mImageView;
ImageViewHolder(View view) {
super(view);
ButterKnife.inject(this, view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("ImageViewHolder", "onClick--> position = " + getPosition());
}
});
}
}
}
怎麼樣,是不是很簡單,沒錯,就是這麼簡單,但是只要會了這個多Item,那麼你就可以做出很多效果了,比如HeaderView和BottomView也是可以通過這種方式來實現的。(HeaderView Adapter)
二、效果圖如下: