RecyclerView的Adapter綁定多類型ViewHolder

RecyclerView的Adapter綁定多類型ViewHolder

具體流程

1、與一般Adapter的處理流程類似

2、覆蓋Adapter的getItemViewType(int position),通過自定義設置不同位置的View的類型。

3、在onCreateViewHolder(ViewGroup parent, int viewType)中對不同的View類型創建不同的ViewHolder。

使用場景

需要在RecyclerView列表的頂部(中間、底部)增加必要的視圖。

注意事項

getItemCount()方法中要注意返回的數量,可能不在是主要數據的個數了,具體看目標view的設計。

擴展

1. 通過RecyclerView獲取指定position的ViewHolder

一般使用以下方法就能獲取:

RecyclerView.findViewHolderForAdapterPosition(int position);

具體代碼如下:

public ViewHolder getHolder(RecyclerView container, int position) {
	if (position < 0 || container.getAdapter == null) return null;
    int count = container.getAdapter().getItemCount();
    if (position >= count) return null;
    return container.findViewHolderForAdapterPosition(position);
}
2. 判斷是否滾動至頂部或底部

需要用到以下兩個方法:

LayoutManager.findFirstVisibleItemPosition(); // 獲取當前可見的第一個ItemView所在列表的位置
LayoutManager.findLastVisibleItemPosition();  // 獲取當前可見的最後一個ItemView所在列表的位置

判斷是否到達頂部的方法:

public boolean isScrollToTop(RecyclerView container) {
    if (container.getAdapter == null) return false;
    return container.getLayoutManager().findFirstVisibleItemPosition() == 0;
}

判斷是否到達底部的方法:

public boolean isScrollToBottom(RecyclerView container) {
    LinearLayoutManager manager = (LinearLayoutManager) container.getLayoutManager();
	//當前屏幕所看到的子項個數
	int visibleCount = manager.getChildCount(); 
    //當前RecyclerView的所有子項個數
    int totalCount = manager.getItemCount();
    if (visibleCount == totalItemCount) return true;
    //屏幕中最後一個可見子項的position
    int lastVisiblePosition = layoutManager.findLastVisibleItemPosition();
    //RecyclerView的滑動狀態
    int state = recyclerView.getScrollState();  
    if (lastVisiblePosition == totalCount - 1 && state == container.SCROLL_STATE_IDLE) {
        return true;
    } else {
        return false;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章