簡 介
VirtualLayout是一個針對RecyclerView的LayoutManager擴展, 主要提供一整套佈局方案和佈局間的組件複用的問題。
配 置
compile 'com.alibaba.android:vlayout:1.0.9'
初 步
目前看了一下源碼,大致能看懂其基本的設計思路,但具體的代碼細節沒有關注:
- 其主要的關注點在於
LayoutManager
和Adapter
,以及他們之間如何管理的。
- 其主要的關注點在於
其Demo描述的東西:
MainActivity:展示了最基本的使用方式,但這種實現方式是使用了”一個Adapter配合多個Helpers”的方式,所以你必須去自己管理哪個位置顯示什麼東西。
VLayoutActivity:展示了應該使用的方式,使用”多個DelegateAdapter+多個Helpers”的方式,你只需要去關心單個DelegateAdapter的細節,大致的表述就是這樣的。
使 用
首先要搞清楚
Helper
與Adapter
的區別,因爲區別於BaseAdapter
這個開源框架,後者通過包裹Adapter
來實現佈局的變化,而前者只有一個Adapter
,只是通過改變LayoutManager
來實現界面的不同。比如
SingleLayoutHelper
,它代表了一個單獨的Item
,你添加一個SingleLayoutHelper
,就會出現一個Item
,原本的佈局特性也會被改變,所以在onBindViewHolder
方法中要對佈局進行變化。創建一個 RecyclerView:
RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
- 創建一個 LayoutManager:
VirtualLayoutManager layoutManager = new VirtualLayoutManager(this);
- 使用一個集合來存放 Helpler,並開始不斷創建 Helpler,Helpler 種類很多:
List<LayoutHelper> helpers = new LinkedList<>();
SingleLayoutHelper mHelper1 = new SingleLayoutHelper(); // 單行
mHelper1.setBgColor(Color.parseColor("#ebebeb"));
helpers.add(mHelper1);
GridLayoutHelper mHelper4 = new GridLayoutHelper(5, 10); // Grid 佈局
helpers.add(mHelper4);
LinearLayoutHelper mHelper3 = new LinearLayoutHelper(); // 很多行,需要設置行數,還需要在內部使用佈局參數
mHelper3.setItemCount(30);
helpers.add(mHelper3);
- 填充完畢之後就放置到 LayoutManager 中:
layoutManager.setLayoutHelpers(helpers);
- 創建一個 Adapter,傳入 LayoutManager ,注意這個適配器必須可以繼承
VirtualLayoutAdapter<VH>
,也可以自己定義一個,因爲其本質上是 RecyclerView.ViewHolder:
class MMLayoutAdapter extends VirtualLayoutAdapter<MMLayoutAdapter.ViewHolder>{
.......
class ViewHolder extends RecyclerView.ViewHolder{
public ViewHolder(View itemView) {
super(itemView);
}
}
}
- 注意:這裏不止要傳入一個數據集,而是你傳入了幾個 Helpler,就需要給其定製數據集,我的例子裏面沒有放入數據集,而是添加了一個上拉記載刷新的方法,這個方法是參考 BaseAdapter 框架裏面的
LoadMoreWrapper
,因爲用的比較多:
public class MMLayoutAdapter extends VirtualLayoutAdapter<MMLayoutAdapter.ViewHolder> {
private Context mContext;
private final static int LOAD_MORE = 1;
private final static int NORMAL = 2;
private OnLoadMoreListener moreListener;
public MMLayoutAdapter(@NonNull VirtualLayoutManager layoutManager,
Context context) {
super(layoutManager);
mContext = context;
}
public void setLoadMoreListener(OnLoadMoreListener listener){
moreListener = listener;
}
private boolean isShowLoadMore(int position)
{
int count = 0;
List<LayoutHelper> helpers = getLayoutHelpers();
for (int i = 0, size = helpers.size(); i < size; i++) {
count += helpers.get(i).getItemCount();
}
return position >= count;
}
@Override
public int getItemViewType(int position) {
if (isShowLoadMore(position)){
return LOAD_MORE;
}
return NORMAL;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType){
case LOAD_MORE:
return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_load_more, null));
case NORMAL:
return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_a, null));
default:
return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_a, null));
}
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Log.e("dc", "onBindViewHolder ----- position = " + position);
if (position == 0){
}else if (position == 1){
}else if (position >= 2 && position <=11){
RecyclerView.LayoutParams mParams = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 200);
holder.itemView.setLayoutParams(mParams);
}else if (position >= 12){
RecyclerView.LayoutParams mParams = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 200);
holder.itemView.setLayoutParams(mParams);
}
if (isShowLoadMore(position)){
RecyclerView.LayoutParams mParams = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100);
holder.itemView.setLayoutParams(mParams);
holder.itemView.setBackgroundColor(Color.RED);
if (moreListener != null) moreListener.onLoadMoreRequested();
}
}
@Override
public int getItemCount() {
List<LayoutHelper> helpers = getLayoutHelpers();
if (helpers == null) {
return 0;
}
int count = 0;
for (int i = 0, size = helpers.size(); i < size; i++) {
count += helpers.get(i).getItemCount();
}
return count + 1;
}
class ViewHolder extends RecyclerView.ViewHolder{
public ViewHolder(View itemView) {
super(itemView);
}
}
public interface OnLoadMoreListener
{
void onLoadMoreRequested();
}
}
- 在
onBindViewHolder
方法裏面對每個位置的佈局進行了安排。