編輯:關於Android編程
如果只是想添加頭部,可是使用GitHub裡面這個項目,它可以為LinearLayoutManager,GridLayoutManager ,StaggeredGridLayoutManager布局的RecyclerView添加header。使用起來也十分簡單;
只需將RecyclerViewHeader布局放在RecyclerView的上層。
<FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal|top" /> <com.bartoszlipinski.recyclerviewheader.RecyclerViewHeader android:id="@+id/header" android:layout_width="match_parent" android:layout_height="100dp" android:layout_gravity="center_horizontal|top"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="header"/> </com.bartoszlipinski.recyclerviewheader.RecyclerViewHeader> </FrameLayout>
然後獲得RecyclerViewHeader對象:
RecyclerViewHeader header = (RecyclerViewHeader) findViewById(R.id.header);
把RecyclerViewHeader賦予RecyclerView
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); // set LayoutManager for your RecyclerView header.attachTo(recyclerView, true);
注意事項
RecyclerViewHeader必須在RecyclerView設置了LayoutManager之後調用。
目前該庫適用於LinearLayoutManager,StaggeredGridLayoutManager和GridLayoutManager布局的RecyclerViews。只支持垂直布局LayoutManager。如果你打算在RecyclerView中使用setOnScrollListener(…)方法,確保在setOnScrollListener(…)的attachTo(…)方法之前使用。
當然我們也可以自己寫一個添加頭部和底部的RecyclerView。它實現的基本原理也是通過getItemViewType方法返回不同的類型來添加頭部和底部。
首先我們自定義一個RecyclerView:
public class WrapRecyclerView extends RecyclerView {
public ArrayList<View> mHeaderViews = new ArrayList<>();
public ArrayList<View> mFooterViews = new ArrayList<>();
//添加Adapter
public Adapter mAdapter;
public WrapRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public WrapRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public WrapRecyclerView(Context context) {
super(context);
}
public void addHeaderView(View view){
mHeaderViews.clear();
mHeaderViews.add(view);
if(mAdapter!=null){
if(!(mAdapter instanceof RecyclerWrapAdapter)){
mAdapter = new RecyclerWrapAdapter(mHeaderViews,mFooterViews,mAdapter);
}
}
}
public void addFooterView(View view){
mFooterViews.clear();
mFooterViews.add(view);
if(mAdapter!=null){
if(!(mAdapter instanceof RecyclerWrapAdapter)){
mAdapter = new RecyclerWrapAdapter(mHeaderViews,mFooterViews,mAdapter);
}
}
}
public void setAdapter(Adapter adapter){
if (mHeaderViews.isEmpty()&&mFooterViews.isEmpty()){
super.setAdapter(adapter);
}else {
adapter = new RecyclerWrapAdapter(mHeaderViews,mFooterViews,adapter) ;
super.setAdapter(adapter);
}
mAdapter = adapter ;
}
}
我們會看到我們有一個RecyclerWrapAdapter沒有實現,下面我們就來看下RecyclerWrapAdapter,這個也是實現添加頭部和尾部的關鍵。
public class RecyclerWrapAdapter extends RecyclerView.Adapter implements WrapperAdapter{
private RecyclerView.Adapter mAdapter;
private ArrayList<View> mHeaderViews;
private ArrayList<View> mFootViews;
static final ArrayList<View> EMPTY_INFO_LIST =
new ArrayList<View>();
private int mCurrentPosition;
public RecyclerWrapAdapter(ArrayList<View> mHeaderViews, ArrayList<View> mFootViews, RecyclerView.Adapter mAdapter){
this.mAdapter = mAdapter;
if (mHeaderViews == null) {
this.mHeaderViews = EMPTY_INFO_LIST;
} else {
this.mHeaderViews = mHeaderViews;
}
if (mFootViews == null) {
this.mFootViews = EMPTY_INFO_LIST;
} else {
this.mFootViews = mFootViews;
}
}
public int getHeadersCount() {
return mHeaderViews.size();
}
public int getFootersCount() {
return mFootViews.size();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == RecyclerView.INVALID_TYPE) {
return new HeaderViewHolder(mHeaderViews.get(0));
} else if (viewType == RecyclerView.INVALID_TYPE - 1) {
return new HeaderViewHolder(mFootViews.get(0));
}
return mAdapter.onCreateViewHolder(parent, viewType);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//如果頭部不為空,那麼我們就要先添加頭部,所以我們只要
//把前面幾個position給頭部,當position小於頭部總數的時候,
//我們返回頭部view。再判斷原Adapter 的 count 與當前 position
// 的差值來比較,是調用原 Adapter 的 getView 方法,還是獲取 footView
// 的 view。
int numHeaders = getHeadersCount();
if (position < numHeaders) {
return;
}
int adjPosition = position - numHeaders;
int adapterCount = 0;
if (mAdapter != null) {
adapterCount = mAdapter.getItemCount();
if (adjPosition < adapterCount) {
mAdapter.onBindViewHolder(holder, adjPosition);
return;
}
}
}
@Override
public int getItemCount() {
if (mAdapter != null) {
return getHeadersCount() + getFootersCount() + mAdapter.getItemCount();
} else {
return getHeadersCount() + getFootersCount();
}
}
@Override
public RecyclerView.Adapter getWrappedAdapter() {
return mAdapter;
}
@Override
public int getItemViewType(int position) {
//增加兩個類型
//RecyclerView.INVALID_TYPE 添加頭部
//RecyclerView.INVALID_TYPE-1 添加尾部
//如果頭部不為空,那麼我們就要先添加頭部,所以我們只要
//把前面幾個position給頭部,當position小於頭部總數的時候,
//我們返回頭部類型。再判斷原Adapter 的 count 與當前 position
// 的差值來比較,是調用原 Adapter 的 類型,還是獲取 footView
// 的類型。
mCurrentPosition = position ;
int numHeaders = getHeadersCount();
if(position<numHeaders){
return RecyclerView.INVALID_TYPE ;
}
int adjPosition = position - numHeaders ;
int adapterCount = 0 ;
if(mAdapter!=null){
adapterCount = mAdapter.getItemCount() ;
if(adjPosition < adapterCount){
return mAdapter.getItemViewType(adjPosition);
}
}
return RecyclerView.INVALID_TYPE - 1;
}
private static class HeaderViewHolder extends RecyclerView.ViewHolder {
public HeaderViewHolder(View itemView) {
super(itemView);
}
}
}
我們還可以實現一個接口,來調用RecyclerWrapAdapter對象:
public interface WrapperAdapter {
public RecyclerView.Adapter getWrappedAdapter() ;
}
這樣我們就可以把RecyclerView布局改成WrapRecyclerView就可以了,然後調用addHeaderView或者addFooterView就可以添加頭部和尾部了。
以上就是本文的全部內容,希望對大家學習Android 軟件編程有所幫助。
TankWar 單機(JAVA版)版本2.2 超級炮彈
既然我們能夠實現一個方向的發子彈,那麼根據同樣的道理 也能夠實現八個方向的發子彈。首先在Tank類的KeyPress方法裡面加上按鍵A的事件 // 我方坦克的
ES文件浏覽器怎麼開啟保護跟打開網絡保護
ES文件浏覽器怎麼開啟保護跟打開網絡保護。ES文件浏覽器很強大的一個軟件。有時我們防止別人進入手機文件,偷看我們的文件的時候,我們設置對ES文件浏覽器開啟保
Android 存儲學習之保存系統短信到SD卡(使用XML序列化器)
上節中我們是手動拼接xml文件,但是上節中那樣的做法會有一個問題,比如: //插入消息的內容sBuffer.append(); sBuffer.append(s
Android自定義view之仿支付寶芝麻信用儀表盤示例
自定義view練習 仿支付寶芝麻信用的儀表盤對比圖:首先是自定義一些屬性,可自己再添加,挺基礎的,上代碼<?xml version=1.0 encoding