2017-07-06 09_46_56.gif
最近生活發(fā)生了挺多變化,堅持早晚鍛煉,充實起來才發(fā)現生活原來可以如此美好。
1.jpeg
背景
公司項目需要一個可以列表展示,本著多用新控件新特性的想法,就自定義了一個這樣的recyclerview的適配器。
原理
其實實現原理比較簡單,就類似與listview在適配器中添加不同類型的item一樣。根據itemType的不同,初始化不同的itemview,從而來實現。
廢話不多說,我們來上代碼(其實已經說了蠻多廢話啦)
自定義的Adapter
首先自定義一個adapter
public class RefreshAndLoadAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
// 用于存放頭部view和尾部view
private List<View> mHeaderViews;
private List<View> mFooterViews;
···
}
接下來復寫其中比較重要的方法
第一步getItemViewType方法
// 返回對應的view的類型
@Override
public int getItemViewType(int position) {
int realPosition = position;
// 數據源真正的下標位置
if (mHeaderViews != null && mHeaderViews.size() > 0) {
realPosition = position - mHeaderViews.size();
}
// 返回headerview類型
if (mHeaderViews != null && position < mHeaderViews.size()) {
return TYPE_HEADER;
}
// 返回footerview類型
if (mFooterViews != null && mFooterViews.size() > 0) {
if (realPosition >= mData.size()) {
return TYPE_FOOTER;
}
}
return TYPE_ITEM;
}
第二步onCreateViewHolder方法
這里添加的header view或者footer view其實都只能是一種布局,最開始我也想多種類型的布局直接在一個headerlist中來實現,發(fā)現這個方法中不能得到position數據。
不過后來一想,也對,不同布局其實就是不同的viewType了,定義不同的viewType來實現就行啦。
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder holder;
if (viewType == TYPE_HEADER) {
holder = new HeaderViewHolder(mHeaderViews.get(0));
} else if (viewType == TYPE_FOOTER) {
holder = new FooterViewHolder(mFooterViews.get(0));
} else {
View item = mInflater.inflate(R.layout.item_consultant_info, parent, false);
holder = new ItemViewHolder(item);
}
return holder;
}
第三步getItemCount方法
這個方法需要說明一下。根據headerview與footerview的個數來確定count的個數。
@Override
public int getItemCount() {
// 無數據源肯定count為0
if (mData == null)
return 0;
int count = 0;
if (mHeaderViews != null) {
// 添加header view的size個數
count += mHeaderViews.size();
}
// 添加footer view的size個數,并且多一個外部開關來控制底部view的顯示與否,方便數據加載完后隱藏底部view
if (mFooterViews != null && isShowFooter) {
count += mFooterViews.size();
}
return count + mData.size();
}
總結
整體實現的思路就是:
數據源外增加viewType類型,那首先就得清楚,哪個position對應哪種類型的viewType,然后根據不同的viewType進行不同視圖的初始化,從而達到想要的效果,此文只是拋磚引玉,在此基礎上還可以實現更多的功能。
最后放上整體的代碼,如果有錯誤或者問題歡迎指出與討論。歡迎大家關注酒店哥哥,免費訂會場,酒店哥哥,免費訂會場,酒店哥哥,免費訂會場;重要的事情說三遍。
public class RefreshAndLoadAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_ITEM = 0;
private static final int TYPE_FOOTER = 1;
private static final int TYPE_HEADER = 2;
private List<ConsultantInfoBean> mData;
private List<View> mHeaderViews;
private List<View> mFooterViews;
private boolean isShowFooter;
private LayoutInflater mInflater;
private OnItemClickListener listener;
public RefreshAndLoadAdapter(List<ConsultantInfoBean> mData, Context context) {
this.mData = mData;
this.mInflater = LayoutInflater.from(context);
}
public void setRefreshItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder holder;
if (viewType == TYPE_HEADER) {
holder = new HeaderViewHolder(mHeaderViews.get(0));
} else if (viewType == TYPE_FOOTER) {
holder = new FooterViewHolder(mFooterViews.get(0));
} else {
View item = mInflater.inflate(R.layout.item_consultant_info, parent, false);
holder = new ItemViewHolder(item);
}
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
if (holder instanceof ItemViewHolder) {
final int realPosition = position - (mHeaderViews == null ? 0 : mHeaderViews.size());
ItemViewHolder itemHolder = (ItemViewHolder) holder;
if (mData != null && mData.get(realPosition) != null) {
......
}
}
}
@Override
public int getItemCount() {
if (mData == null)
return 0;
int count = 0;
if (mHeaderViews != null) {
count += mHeaderViews.size();
}
if (mFooterViews != null && isShowFooter) {
count += mFooterViews.size();
}
return count + mData.size();
}
@Override
public int getItemViewType(int position) {
int realPosition = position;
if (mHeaderViews != null && mHeaderViews.size() > 0) {
realPosition = position - mHeaderViews.size();
}
if (mHeaderViews != null && position < mHeaderViews.size()) {
return TYPE_HEADER;
}
if (mFooterViews != null && mFooterViews.size() > 0) {
if (realPosition >= mData.size()) {
return TYPE_FOOTER;
}
}
return TYPE_ITEM;
}
public void setShowFooter(boolean showFooter) {
isShowFooter = showFooter;
}
public boolean isShowFooter() {
return isShowFooter;
}
private class ItemViewHolder extends RecyclerView.ViewHolder {
......
private View itemView;
ItemViewHolder(View itemView) {
super(itemView);
this.itemView = itemView;
......
}
}
private class FooterViewHolder extends RecyclerView.ViewHolder {
FooterViewHolder(View itemView) {
super(itemView);
}
}
private class HeaderViewHolder extends RecyclerView.ViewHolder {
HeaderViewHolder(View itemView) {
super(itemView);
}
}
// 暫時只支持HeaderView為1
public void setHeaderView(View headView) {
if (mHeaderViews == null) {
mHeaderViews = new ArrayList<>();
}
mHeaderViews.clear();
mHeaderViews.add(headView);
}
public void setFooterView(View footerView) {
if (mFooterViews == null) {
mFooterViews = new ArrayList<>();
}
mFooterViews.clear();
mFooterViews.add(footerView);
}
public int getCount() {
return mData.size();
}
public interface OnItemClickListener{
void onItemClick(int position);
}
}