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;
}
}