private void changeViewLayout() { LayoutInflater inflater = LayoutInflater.from(getActivity()); ViewGroup viewGroup = (ViewGroup) getView(); viewGroup.removeAllViewsInLayout(); View view = onCreateView(inflater, viewGroup, null); viewGroup.addView(view); onViewCreated(this.getView(), null); }
@Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ViewGroup p = (ViewGroup) mainView.getParent(); if (p != null) { p.removeAllViewsInLayout(); } return mainView; }
@Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub ViewGroup p = (ViewGroup) mRootView.getParent(); if (p != null) { p.removeAllViewsInLayout(); } return mRootView; }
/** * remove all views * * @param viewGroup */ public static void removeAllViews(ViewGroup viewGroup) { if (viewGroup != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { if (viewGroup.isInLayout()) { viewGroup.removeAllViewsInLayout(); } else { viewGroup.removeAllViews(); } } else { viewGroup.removeAllViews(); } } }
/** * Shows only the specified child. The other displays Views exit the screen, * optionally with the with the {@link #getOutAnimation() out animation} and * the specified child enters the screen, optionally with the * {@link #getInAnimation() in animation}. * * @param childIndex The index of the child to be shown. * @param animate Whether or not to use the in and out animations, defaults * to true. */ void showOnly(int childIndex, boolean animate) { if (mAdapter == null) return; final int adapterCount = getCount(); if (adapterCount == 0) return; for (int i = 0; i < mPreviousViews.size(); i++) { View viewToRemove = mViewsMap.get(mPreviousViews.get(i)).view; mViewsMap.remove(mPreviousViews.get(i)); viewToRemove.clearAnimation(); if (viewToRemove instanceof ViewGroup) { ViewGroup vg = (ViewGroup) viewToRemove; vg.removeAllViewsInLayout(); } // applyTransformForChildAtIndex here just allows for any cleanup // associated with this view that may need to be done by a subclass applyTransformForChildAtIndex(viewToRemove, -1); removeViewInLayout(viewToRemove); } mPreviousViews.clear(); int newWindowStartUnbounded = childIndex - mActiveOffset; int newWindowEndUnbounded = newWindowStartUnbounded + getNumActiveViews() - 1; int newWindowStart = Math.max(0, newWindowStartUnbounded); int newWindowEnd = Math.min(adapterCount - 1, newWindowEndUnbounded); if (mLoopViews) { newWindowStart = newWindowStartUnbounded; newWindowEnd = newWindowEndUnbounded; } int rangeStart = modulo(newWindowStart, getWindowSize()); int rangeEnd = modulo(newWindowEnd, getWindowSize()); boolean wrap = false; if (rangeStart > rangeEnd) { wrap = true; } // This section clears out any items that are in our active views list // but are outside the effective bounds of our window (this is becomes an issue // at the extremities of the list, eg. where newWindowStartUnbounded < 0 or // newWindowEndUnbounded > adapterCount - 1 for (Integer index : mViewsMap.keySet()) { boolean remove = false; if (!wrap && (index < rangeStart || index > rangeEnd)) { remove = true; } else if (wrap && (index > rangeEnd && index < rangeStart)) { remove = true; } if (remove) { View previousView = mViewsMap.get(index).view; int oldRelativeIndex = mViewsMap.get(index).relativeIndex; mPreviousViews.add(index); transformViewForTransition(oldRelativeIndex, -1, previousView, animate); } } // If the window has changed if (!(newWindowStart == mCurrentWindowStart && newWindowEnd == mCurrentWindowEnd && newWindowStartUnbounded == mCurrentWindowStartUnbounded)) { // Run through the indices in the new range for (int i = newWindowStart; i <= newWindowEnd; i++) { int index = modulo(i, getWindowSize()); int oldRelativeIndex; if (mViewsMap.containsKey(index)) { oldRelativeIndex = mViewsMap.get(index).relativeIndex; } else { oldRelativeIndex = -1; } int newRelativeIndex = i - newWindowStartUnbounded; // If this item is in the current window, great, we just need to apply // the transform for it's new relative position in the window, and animate // between it's current and new relative positions boolean inOldRange = mViewsMap.containsKey(index) && !mPreviousViews.contains(index); if (inOldRange) { View view = mViewsMap.get(index).view; mViewsMap.get(index).relativeIndex = newRelativeIndex; applyTransformForChildAtIndex(view, newRelativeIndex); transformViewForTransition(oldRelativeIndex, newRelativeIndex, view, animate); // Otherwise this view is new to the window } else { // Get the new view from the adapter, add it and apply any transform / animation final int adapterPosition = modulo(i, adapterCount); View newView = mAdapter.getView(adapterPosition, null, this); long itemId = mAdapter.getItemId(adapterPosition); // We wrap the new view in a FrameLayout so as to respect the contract // with the adapter, that is, that we don't modify this view directly FrameLayout fl = getFrameForChild(); // If the view from the adapter is null, we still keep an empty frame in place if (newView != null) { fl.addView(newView); } mViewsMap.put(index, new ViewAndMetaData(fl, newRelativeIndex, adapterPosition, itemId)); addChild(fl); applyTransformForChildAtIndex(fl, newRelativeIndex); transformViewForTransition(-1, newRelativeIndex, fl, animate); } mViewsMap.get(index).view.bringToFront(); } mCurrentWindowStart = newWindowStart; mCurrentWindowEnd = newWindowEnd; mCurrentWindowStartUnbounded = newWindowStartUnbounded; if (mRemoteViewsAdapter != null) { int adapterStart = modulo(mCurrentWindowStart, adapterCount); int adapterEnd = modulo(mCurrentWindowEnd, adapterCount); mRemoteViewsAdapter.setVisibleRangeHint(adapterStart, adapterEnd); } } requestLayout(); invalidate(); }