content: /*
   * 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.adapter;
  
  import android.support.v4.view.PagerAdapter;
  import android.util.SparseArray;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.RelativeLayout;
  
  import com.taobao.luaview.userdata.base.UDLuaTable;
  import com.taobao.luaview.userdata.ui.UDView;
  import com.taobao.luaview.userdata.ui.UDViewGroup;
  import com.taobao.luaview.userdata.ui.UDViewPager;
  import com.taobao.luaview.util.LuaViewUtil;
  import com.taobao.luaview.view.LVViewGroup;
  
  import org.luaj.vm2.Globals;
  
  import java.lang.ref.WeakReference;
  
  /**
   * Pager Adapter
   *
   * @author song
   * @date 15/9/17
   */
  public class LVPagerAdapter extends PagerAdapter {
      private UDViewPager mInitProps;
      private Globals mGlobals;
  
      private SparseArray<WeakReference<View>> mViews;
  
      public LVPagerAdapter(Globals globals, UDViewPager udListView) {
          this.mGlobals = globals;
          this.mInitProps = udListView;
          this.mViews = new SparseArray<WeakReference<View>>();
      }
  
      @Override
      public int getCount() {
          return this.mInitProps.getPageCount();
      }
  
      @Override
      public CharSequence getPageTitle(int position) {
          return this.mInitProps.getPageTitle(position);
      }
  
      @Override
      public Object instantiateItem(ViewGroup container, int position) {
          return newItem(container, position);
      }
  
      public Object newItem(ViewGroup container, int position) {
          //View封装
          final UDView page = new UDViewGroup(createPageLayout(), mGlobals, null);//TODO 为什么用mLuaUserData.getmetatable()不行
          //对外数据封装，必须使用LuaTable
          final UDLuaTable pageData = new UDLuaTable(page);
          final View pageView = pageData.getView();
          //添加view
          if(container != null && pageView != null) {
              container.addView(pageView);
          }
          //初始化View
          initView(pageData, position);
          //绘制数据
          renderView(pageData, position);
          //add to list
          mViews.put(position, new WeakReference<View>(pageView));
          return pageView;
      }
  
      @Override
      public void destroyItem(ViewGroup container, int position, Object object) {
          removeItem(container, position, object);
      }
  
      /**
       * remove item from container
       *
       * @param container
       * @param position
       * @param object
       */
      private void removeItem(ViewGroup container, int position, Object object) {
          if (container != null && object instanceof View) {
              container.removeView((View) object);
          }
      }
  
      /**
       * 创建一个layout params，并不能改变view的大小
       *
       * @param container
       * @return
       */
      private RelativeLayout.LayoutParams createLayoutParams(ViewGroup container) {
          final RelativeLayout.LayoutParams layoutParams = LuaViewUtil.createRelativeLayoutParamsWM();
          if(container != null) {
              layoutParams.width = container.getMeasuredWidth();
              layoutParams.height = container.getMeasuredHeight();
          }
          return layoutParams;
      }
  
      /**
       * 调用LuaView的Init方法进行Cell的初始化
       *
       * @param position
       * @return
       */
      private void initView(UDLuaTable page, int position) {
          this.mGlobals.saveContainer(page.getLVViewGroup());
          this.mInitProps.callPageInit(page, position);
          this.mGlobals.restoreContainer();
      }
  
      /**
       * 调用LuaView的Layout方法进行数据填充
       *
       * @param page
       * @param position
       */
      private void renderView(UDLuaTable page, int position) {
          this.mGlobals.saveContainer(page.getLVViewGroup());
          this.mInitProps.callPageLayout(page, position);
          this.mGlobals.restoreContainer();
      }
  
      /**
       * 创建 cell 的布局
       *
       * @return
       */
      private LVViewGroup createPageLayout() {
          return new LVViewGroup(mGlobals, mInitProps.getmetatable(), null);
      }
  
      @Override
      public boolean isViewFromObject(View view, Object object) {
          return view == object;
      }
  }
  