1. 界面
就是實(shí)現(xiàn)一個(gè)有頭部敌厘、內(nèi)容部分和底部的 RecyclerView亲铡,頭部為置頂?shù)墓妫撞坑幸粋€(gè)按鈕可以添加 item
以下為實(shí)際界面圖:
2. 實(shí)現(xiàn)
首先先新建一個(gè)class文件繼承 RecyclerView.Adapter 代碼如下:
public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
}
由于頭部尾部和中間的 item 的布局都是不一樣的所以我們需要用到 RecyclerView.Adapter 中的 getItemViewType(int position) 這個(gè)方法來判斷 item 的類型,然后在 onCreateViewHolder(ViewGroup parent, int viewType) 中根據(jù)getItemViewType 中返回的 viewType 來進(jìn)行選擇對應(yīng)的布局文件和 ViewHolder剖踊,相關(guān)代碼如下:
// 首先定義幾個(gè)常量標(biāo)記item的類型
public static final int ITEM_TYPE_HEADER = 0;
public static final int ITEM_TYPE_CONTENT = 1;
public static final int ITEM_TYPE_BOTTOM = 2;
private int mHeaderCount = 0;// 頭部的數(shù)量
private int mBottomCount = 0;// 底部的數(shù)量
// 中間內(nèi)容長度
public int getContentItemCount(){
return mContentList.size();
}
// 判斷當(dāng)前item是否是頭部(根據(jù)position來判斷)
public boolean isHeaderView(int position) {
return mHeaderCount != 0 && position < mHeaderCount;
}
// 判斷當(dāng)前item是否是底部
public boolean isBottomView(int position) {
return mBottomCount != 0 && position >= (mHeaderCount + getContentItemCount());
}
// 判斷當(dāng)前item類型
@Override
public int getItemViewType(int position) {
if (isHeaderView(position)) {
// 頭部View
return ITEM_TYPE_HEADER;
}else if (isBottomView(position)) {
// 底部View
return ITEM_TYPE_BOTTOM;
} else {
// 內(nèi)容View
return ITEM_TYPE_CONTENT;
}
}
// 根據(jù)返回的viewType進(jìn)行判斷,選擇對應(yīng)的布局文件和 ViewHolder
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == ITEM_TYPE_HEADER) {
return new HeaderViewHolder(mLayoutInflater.inflate(R.layout.main_activity_list_item_header, parent, false));
}else if (viewType == ITEM_TYPE_CONTENT){
return new ViewHolder(mLayoutInflater.inflate(R.layout.main_activity_list_item_content, parent, false));
}else if (viewType == ITEM_TYPE_BOTTOM){
return new BottomViewHolder(mLayoutInflater.inflate(R.layout.main_activity_list_item_bottom, parent, false));
}
return null;
}
其中 HeaderViewHolder衫贬、ViewHolder德澈、BottomViewHolder 的布局比較簡單這里就不貼出來了,詳情可以到我的Github上看
由于用了三種不同的 ViewHolder 所以在 onBindViewHolder(RecyclerView.ViewHolder holder, final int position) 中就需要判斷 holder 是哪個(gè) item 類型的
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
// 添加了頭部固惯,所以 position 需要進(jìn)行換算
mContentPosition = position - mHeaderCount;
mBottomPosition = position - mHeaderCount - getContentItemCount();
// 通過 instanceof 判斷 holder 繼承自哪個(gè)類來判斷是屬于頭部尾部還是中間
if (holder instanceof ViewHolder){
((ViewHolder)holder).tvTitle.setText(mContentList.get(mContentPosition));
}else if (holder instanceof HeaderViewHolder){
((HeaderViewHolder)holder).tvTitle.setText(mHeaderList.get(position));
}else if (holder instanceof BottomViewHolder){
((BottomViewHolder)holder).relativeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mOnClickItemListener.onClickItem(getItemCount());
}
});
}
}
3. 使用方法
使用方法和普通的 RecyclerView 的用法差不多圃验,只多了幾個(gè)設(shè)置底部和頭部 item 數(shù)量的方法,以下為用法示例
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getBaseContext());
mRecyclerView.setLayoutManager(linearLayoutManager);
// mHeaderList 為頭部數(shù)據(jù)缝呕,mContentList 為中間內(nèi)容的數(shù)據(jù)
EasyAdapter adapter = new EasyAdapter(mHeaderList, mContentList, getBaseContext());
// 在這個(gè)例子中頭部是置頂公告澳窑,有對應(yīng)的數(shù)據(jù),所以在 adapter 中就根據(jù)數(shù)據(jù)的 size 來設(shè)置頭部數(shù)量了
adapter.setBottomCount(1);
mRecyclerView.setAdapter(adapter);
4. 運(yùn)行效果圖
5. Github 項(xiàng)目地址
https://github.com/RoNnx/EasyRecyclerView
本文作者:RoNnx
博客鏈接:http://ronnx.top/2018/07/09/20180005/
版權(quán)聲明:本作品采用「知識共享署名-非商業(yè)性使用-相同方式共享 4.0 國際許可協(xié)議 進(jìn)行許可」,轉(zhuǎn)載請注明出處供常!