/* * Created by LuaView. * Copyright (c) 2017, Alibaba Group. All rights reserved. * * This source code is licensed under the MIT. * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree. */ package com.taobao.luaview.view; import android.content.Context; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import com.taobao.android.luaview.R; import com.taobao.luaview.userdata.list.UDBaseRecyclerView; import com.taobao.luaview.userdata.list.UDRecyclerView; import com.taobao.luaview.userdata.ui.UDView; import com.taobao.luaview.util.LuaViewUtil; import com.taobao.luaview.view.interfaces.ILVRecyclerView; import com.taobao.luaview.view.recyclerview.LVRecyclerViewAdapter; import com.taobao.luaview.view.recyclerview.RecyclerViewHelper; import com.taobao.luaview.view.recyclerview.decoration.DividerGridItemDecoration; import com.taobao.luaview.view.recyclerview.decoration.DividerItemDecoration; import com.taobao.luaview.view.recyclerview.layout.LVGridLayoutManager; import org.luaj.vm2.Globals; import org.luaj.vm2.LuaValue; import org.luaj.vm2.Varargs; import java.util.ArrayList; /** * LuaView - RecyclerView * * @author song * @date 15/8/20 */ public class LVRecyclerView extends RecyclerView implements ILVRecyclerView { private UDBaseRecyclerView mLuaUserdata; //adapter private RecyclerView.Adapter mAdapter; private LayoutManager mLayoutManager; private ItemDecoration mItemDecoration; private int mSpacing = 0;//间隔 public static LVRecyclerView createVerticalView(Globals globals, LuaValue metaTable, Varargs varargs, UDBaseRecyclerView udBaseRecyclerView) { final LVRecyclerView lvRecyclerView = (LVRecyclerView) LayoutInflater.from(globals.getContext()).inflate(R.layout.lv_recyclerview_vertical, null); return lvRecyclerView.init(globals, metaTable, varargs, udBaseRecyclerView); } /** * 构造函数 * * @param context * @param attrs */ public LVRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); } public LVRecyclerView init(Globals globals, LuaValue metaTable, Varargs varargs, UDBaseRecyclerView udBaseRecyclerView) { LuaViewUtil.setId(this); this.mLuaUserdata = udBaseRecyclerView != null ? udBaseRecyclerView : new UDRecyclerView(this, globals, metaTable, varargs); init(globals); return this; } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); //改变大小的时候需要更新spanCount & spanSize updateMaxSpanCount(); } private void init(Globals globals) { mAdapter = new LVRecyclerViewAdapter(globals, mLuaUserdata); this.setAdapter(mAdapter); mLayoutManager = new LVGridLayoutManager(this); this.setLayoutManager(mLayoutManager); mLuaUserdata.initOnScrollCallback(this); this.setHasFixedSize(true); initViewHolderPool(); } /** * 初始化ViewHolder缓存池 */ private void initViewHolderPool() { //设置ViewHolder缓存的数 final RecycledViewPool pool = getRecycledViewPool(); if (pool != null) { for (int i = 0; i < 100; i++) { pool.setMaxRecycledViews(i, 10); } } } /** * 更新最大间隔 */ public void updateMaxSpanCount() { if (mLayoutManager instanceof GridLayoutManager) { ((GridLayoutManager) mLayoutManager).setSpanCount(mLuaUserdata.getMaxSpanCount()); } else if (mLayoutManager instanceof StaggeredGridLayoutManager) { ((StaggeredGridLayoutManager) mLayoutManager).setSpanCount(mLuaUserdata.getMaxSpanCount()); } } public int getSpanSize(int position) { return mLuaUserdata.getSpanSize(position); } @Override public UDView getUserdata() { return mLuaUserdata; } @Override public void setChildNodeViews(ArrayList<UDView> childNodeViews) { } @Override public RecyclerView.Adapter getLVAdapter() { return mAdapter; } //-------------------------------------------list view封装--------------------------------------- public int getFirstVisiblePosition() { return RecyclerViewHelper.getFirstVisiblePosition(this); } public int getLastVisiblePosition() { return RecyclerViewHelper.getLastVisiblePosition(this); } public int getVisibleItemCount() { return RecyclerViewHelper.getVisibleItemCount(this); } public void setMiniSpacing(int spacing) { if (mItemDecoration == null || mSpacing != spacing) { this.removeItemDecoration(mItemDecoration); mSpacing = spacing; mItemDecoration = new DividerGridItemDecoration(spacing); this.addItemDecoration(mItemDecoration); } } public int getMiniSpacing() { return mSpacing; } }