/** @param loading should be {@link WXRefreshView} */ public void setFooterView(WXComponent loading) { setLoadmoreEnable(true); if (swipeLayout != null) { if (swipeLayout.getFooterView() != null) { swipeLayout.setLoadingHeight((int) loading.getDomObject().getLayoutHeight()); String colorStr = (String) loading.getDomObject().getStyles().get(Constants.Name.BACKGROUND_COLOR); String bgColor = WXUtils.getString(colorStr, null); if (bgColor != null) { if (!TextUtils.isEmpty(bgColor)) { int colorInt = WXResourceUtils.getColor(bgColor); if (!(colorInt == Color.TRANSPARENT)) { swipeLayout.setLoadingBgColor(colorInt); } } } swipeLayout.getFooterView().setRefreshView(loading.getHostView()); } } }
/** * Create an instance of {@link ListBaseViewHolder} for the given viewType (not for the given * index). This method will look up for the first component that fits the viewType requirement and * doesn't be used. Then create the certain type of view, detach the view f[rom the component. * * @param parent the ViewGroup into which the new view will be inserted * @param viewType the type of the new view * @return the created view holder. */ @Override public ListBaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (mChildren != null) { if (mViewTypes == null) return createVHForFakeComponent(viewType); ArrayList<WXComponent> mTypes = mViewTypes.get(viewType); checkRecycledViewPool(viewType); if (mTypes == null) return createVHForFakeComponent(viewType); for (int i = 0; i < mTypes.size(); i++) { WXComponent component = mTypes.get(i); if (component == null || component.isUsing()) { continue; } if (component.getDomObject() != null && component.getDomObject().isFixed()) { return createVHForFakeComponent(viewType); } else { if (component instanceof WXCell) { if (component.getRealView() != null) { return new ListBaseViewHolder(component, viewType); } else { component.lazy(false); component.createView(this, -1); component.applyLayoutAndEvent(component); return new ListBaseViewHolder(component, viewType); } } else { WXLogUtils.e( TAG, "List cannot include element except cell、header、fixed、refresh and loading"); return createVHForFakeComponent(viewType); } } } } if (WXEnvironment.isApkDebugable()) { WXLogUtils.e(TAG, "Cannot find request viewType: " + viewType); } return createVHForFakeComponent(viewType); }
/** * Bind the component of the position to the holder. Then flush the view. * * @param holder viewHolder, which holds reference to the view * @param position position of component in WXListComponent */ @Override public void onBindViewHolder(ListBaseViewHolder holder, int position) { if (holder == null) return; holder.setComponentUsing(true); WXComponent component = getChild(position); if (component == null || (component instanceof WXRefresh) || (component instanceof WXLoading) || (component.getDomObject() != null && component.getDomObject().isFixed())) { if (WXEnvironment.isApkDebugable()) { WXLogUtils.d(TAG, "Bind WXRefresh & WXLoading " + holder); } return; } if (component != null && holder.getComponent() != null && holder.getComponent() instanceof WXCell) { holder.getComponent().bindData(component); // holder.getComponent().refreshData(component); } }
/** * generate viewtype by component * * @param component * @return */ private int generateViewType(WXComponent component) { long id; try { id = Integer.parseInt(component.getDomObject().getRef()); String type = component.getDomObject().getAttrs().getScope(); if (!TextUtils.isEmpty(type)) { if (mRefToViewType == null) { mRefToViewType = new ArrayMap<>(); } if (!mRefToViewType.containsKey(type)) { mRefToViewType.put(type, id); } id = mRefToViewType.get(type); } } catch (RuntimeException e) { WXLogUtils.eTag(TAG, e); id = RecyclerView.NO_ID; WXLogUtils.e( TAG, "getItemViewType: NO ID, this will crash the whole render system of WXListRecyclerView"); } return (int) id; }
@Override public void onBeforeScroll(int dx, int dy) { if (mStickyMap == null) { return; } HashMap<String, WXComponent> stickyMap = mStickyMap.get(getRef()); if (stickyMap == null) { return; } Iterator<Map.Entry<String, WXComponent>> iterator = stickyMap.entrySet().iterator(); Map.Entry<String, WXComponent> entry; WXComponent stickyComponent; while (iterator.hasNext()) { entry = iterator.next(); stickyComponent = entry.getValue(); if (stickyComponent != null && stickyComponent.getDomObject() != null && stickyComponent instanceof WXCell) { if (stickyComponent.getHostView() == null) { return; } int[] location = new int[2]; stickyComponent.getHostView().getLocationOnScreen(location); int[] parentLocation = new int[2]; stickyComponent.getParentScroller().getView().getLocationOnScreen(parentLocation); int top = location[1] - parentLocation[1]; boolean showSticky = ((WXCell) stickyComponent).lastLocationY > 0 && top <= 0 && dy > 0; boolean removeSticky = ((WXCell) stickyComponent).lastLocationY <= 0 && top > 0 && dy < 0; if (showSticky) { bounceRecyclerView.notifyStickyShow((WXCell) stickyComponent); } else if (removeSticky) { bounceRecyclerView.notifyStickyRemove((WXCell) stickyComponent); } ((WXCell) stickyComponent).lastLocationY = top; } } }