/*
* 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.recyclerview;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import com.taobao.luaview.global.Constants;
import com.taobao.luaview.userdata.base.UDLuaTable;
import com.taobao.luaview.userdata.list.UDBaseRecyclerView;
import com.taobao.luaview.userdata.ui.UDViewGroup;
import com.taobao.luaview.view.LVViewGroup;
import org.luaj.vm2.Globals;
/**
* Adapter for RecyclerView
*
* @author song
* @date 15/11/30
*/
public class LVRecyclerViewAdapter extends RecyclerView.Adapter<LVRecyclerViewHolder> {
private UDBaseRecyclerView mLuaUserData;
private Globals mGlobals;
public LVRecyclerViewAdapter(Globals globals, UDBaseRecyclerView luaViewData) {
this.mGlobals = globals;
this.mLuaUserData = luaViewData;
}
@Override
public LVRecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
final View itemView = createItemView(viewType);
LVRecyclerViewHolder holder = new LVRecyclerViewHolder(itemView, mGlobals, mLuaUserData);
int position = this.mLuaUserData.mPinnedViewTypePosition.get(viewType, -1);
if (position != -1) {
this.mLuaUserData.mPinnedPositionHolder.put(position, holder);
}
return holder;
}
/**
* create item view for view holder
*
* @param viewType
* @return
*/
private View createItemView(final int viewType) {
final UDViewGroup layout = new UDViewGroup(createLayout(), mGlobals, null);
//对外数据封装,必须使用LuaTable
final UDLuaTable cellData = new UDLuaTable(layout);
View itemView = null;
//View封装
if (this.mLuaUserData.hasCellSize(viewType)) {//有Size的定义
final LVViewGroup cellView = createLayout();
View tmpView = layout.getView();
if(tmpView != null) {
cellView.addView(tmpView);
}
itemView = cellView;
} else {
itemView = layout.getView();
}
itemView.setTag(Constants.RES_LV_TAG, cellData);
return itemView;
}
@Override
public int getItemViewType(int position) {//TODO 从0开始,如何去除非viewtype内容
int viewType = this.mLuaUserData.getItemViewType(position);
return viewType;
}
@Override
public void onBindViewHolder(LVRecyclerViewHolder holder, int position) {
if (position >= 0 && position < getItemCount()) {
if (holder != null) {
if (holder.itemView != null) {
holder.itemView.setTag(Constants.RES_LV_TAG_POSITION, position);//设置位置
holder.itemView.setTag(Constants.RES_LV_TAG_PINNED, this.mLuaUserData.mIsPinnedSparseArray.get(position));
}
if (this.mLuaUserData.hasCellSize(getItemViewType(position))) {
if (holder.itemView != null && holder.itemView.getTag(Constants.RES_LV_TAG) instanceof UDLuaTable) {
UDLuaTable cellData = (UDLuaTable) holder.itemView.getTag(Constants.RES_LV_TAG);
initCellSize(cellData, position);//初始化View的size,这里因为每个cell的宽度高度可能不一样,需要再调用一遍
}
}
if (holder.itemView != null && holder.itemView.getTag(Constants.RES_LV_TAG_INIT) == null) {//是否已经调用过onInit,如果调用过则不重复调用
holder.onInit(position);
holder.itemView.setTag(Constants.RES_LV_TAG_INIT, true);
}
holder.onLayout(position);
}
}
}
/**
* 初始化cell的size
*
* @param cell
* @param position
*/
private void initCellSize(final UDLuaTable cell, final int position) {
final View view = cell.getView();
if (view != null) {
int[] size = this.mLuaUserData.callCellSize(cell, position);
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
if (layoutParams == null) {
layoutParams = new AbsListView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
layoutParams.width = size[0];
layoutParams.height = size[1];
view.setLayoutParams(layoutParams);
}
}
@Override
public int getItemCount() {
return this.mLuaUserData.getTotalCount();
}
/**
* 创建 cell 的布局
*
* @return
*/
private LVViewGroup createLayout() {
return new LVViewGroup(mGlobals, mLuaUserData.getmetatable(), null);
}
}