這篇文章需要BRVAH的基礎,不是教程,只是提供方案和思路
不得不說BRVAH真的算是一個很不錯Recyclerview的adapter
裏面用到了一些封裝的方法,很好,雖然有些還沒用過,但是用過的都說好
網上教程很多,尤其是 官方指南 教程寫的更是全面,大多數常用都可以在裏面找到
下面直接寫我實現的功能
注意是一個RecyclerView實現!!!
注意是一個RecyclerView實現!!!
注意是一個RecyclerView實現!!!
實現方式大概有幾種,Recyclerview嵌套是最方便的,如果這樣的話,大概我也就不寫這篇文章了
現在實現方式打算採用一個RecyclerView實現,先觀察上圖,實際上有三種Type,(貢獻排行算是一種)採用傳統的Adapter我們需要自己定義Type,然後去根據不同Type bind不同的layout,下面寫一下如何通過Brvah實現
裏面用到了一個設置不同Type的方式 多佈局代理, GitHub多種佈局代理 詳情移步這裏
一:數據實體
public class LibraryBean {
public static final int Type_Book = 1;//圖書
public static final int Type_Rank = 2;//排行
public static final int Type_Header = 3;//分割線
...................//省略數據
}
我們需要自己定義Type,這樣我們的Adapter才能type-----layout對應上
二:Adapter
public class LibraryAdapter extends BaseQuickAdapter<LibraryBean.ListBean, BaseViewHolder> {
private int size;
public LibraryAdapter(@Nullable List<LibraryBean.ListBean> data, int size) {
super(data);
this.size = size;
//這裏獲取Type類型
setMultiTypeDelegate(new MultiTypeDelegate<LibraryBean.ListBean>() {
@Override
protected int getItemType(LibraryBean.ListBean listBean) {
return listBean.getItemType();
}
});
//這裏添加Type類型
getMultiTypeDelegate().registerItemType(LibraryBean.Type_Book, R.layout.item_book)
.registerItemType(LibraryBean.Type_Rank, R.layout.item_rank)
.registerItemType(LibraryBean.Type_Header, R.layout.header_view);
}
@Override
protected void convert(BaseViewHolder helper, LibraryBean.ListBean item) {
//獲取Type類型
switch (helper.getItemViewType()) {
case LibraryBean.Type_Book:
//填充書籍數據
initBook(helper, item);
break;
case LibraryBean.Type_Rank:
//填充排行數據
initRank(helper, item);
break;
case LibraryBean.Type_Header:
//填充分割線
break;
}
}
}
上面的註釋寫的相對來說比較詳細了…
三:1/1和1/2顯示處理
網上這方面的教程還是比較詳細的…一搜一大把,畢竟這不是重點
..................省略數據
final GridLayoutManager manager = new GridLayoutManager(this, 2);
recyclerView.setLayoutManager(manager);
LibraryAdapter libraryAdapter = new LibraryAdapter(list, size);
libraryAdapter.setSpanSizeLookup(new BaseQuickAdapter.SpanSizeLookup() {
@Override
public int getSpanSize(GridLayoutManager gridLayoutManager, int position) {
//是1/2 和1/1的區別 佔一行 還是1/2
return list.get(position).getItemType() == LibraryBean.Type_Book ? 1 : 2;
}
});
recyclerView.setAdapter(libraryAdapter);
//分割線
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams) view.getLayoutParams();
int spanSize = layoutParams.getSpanSize();
int spanIndex = layoutParams.getSpanIndex();
if (spanSize == manager.getSpanCount()) {
outRect.top = 20;
}
}
});