下面列出了android.view.View#onStartTemporaryDetach ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
public void dispatchStartTemporaryDetach(View view) {
if (!mTempDetachBound) {
bindTempDetach();
}
if (mDispatchStartTemporaryDetach != null) {
try {
mDispatchStartTemporaryDetach.invoke(view);
} catch (Exception e) {
Log.d(TAG, "Error calling dispatchStartTemporaryDetach", e);
}
} else {
// Try this instead
view.onStartTemporaryDetach();
}
}
public void dispatchStartTemporaryDetach(View view) {
if (!this.mTempDetachBound) {
bindTempDetach();
}
if (this.mDispatchStartTemporaryDetach != null) {
try {
this.mDispatchStartTemporaryDetach.invoke(view, new Object[0]);
return;
} catch (Exception e) {
Log.d("ViewCompat", "Error calling dispatchStartTemporaryDetach", e);
return;
}
}
view.onStartTemporaryDetach();
}
/**
* Put a view into the ScapViews list. These views are unordered.
*
* @param scrap The view to add
*/
void addScrapView(View scrap) {
TwoWayAbsListView.LayoutParams lp = (TwoWayAbsListView.LayoutParams) scrap.getLayoutParams();
if (lp == null) {
return;
}
// Don't put header or footer views or views that should be ignored
// into the scrap heap
int viewType = lp.viewType;
if (!shouldRecycleViewType(viewType)) {
if (viewType != ITEM_VIEW_TYPE_HEADER_OR_FOOTER) {
removeDetachedView(scrap, false);
}
return;
}
if (mViewTypeCount == 1) {
scrap.onStartTemporaryDetach();
mCurrentScrap.add(scrap);
} else {
scrap.onStartTemporaryDetach();
mScrapViews[viewType].add(scrap);
}
if (mRecyclerListener != null) {
mRecyclerListener.onMovedToScrapHeap(scrap);
}
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
void scrapActiveViews() {
final View[] activeViews = mActiveViews;
final boolean hasListener = mRecyclerListener != null;
final boolean multipleScraps = mViewTypeCount > 1;
ArrayList<View> scrapViews = mCurrentScrap;
final int count = activeViews.length;
for (int i = count - 1; i >= 0; i--) {
final View victim = activeViews[i];
if (victim != null) {
final LayoutParams lp = (LayoutParams) victim.getLayoutParams();
int whichScrap = lp.viewType;
activeViews[i] = null;
final boolean scrapHasTransientState = Build.VERSION.SDK_INT >= 16 ? victim
.hasTransientState() : false;
if (!shouldRecycleViewType(whichScrap) || scrapHasTransientState) {
if (whichScrap != ITEM_VIEW_TYPE_HEADER_OR_FOOTER &&
scrapHasTransientState) {
removeDetachedView(victim, false);
}
if (scrapHasTransientState) {
if (mAdapter != null && mAdapterHasStableIds) {
if (mTransientStateViewsById == null) {
mTransientStateViewsById = new LongSparseArray<View>();
}
long id = mAdapter.getItemId(mFirstActivePosition + i);
mTransientStateViewsById.put(id, victim);
} else {
if (mTransientStateViews == null) {
mTransientStateViews = new SparseArrayCompat<View>();
}
mTransientStateViews.put(mFirstActivePosition + i, victim);
}
}
continue;
}
if (multipleScraps) {
scrapViews = mScrapViews[whichScrap];
}
victim.onStartTemporaryDetach();
lp.scrappedFromPosition = mFirstActivePosition + i;
scrapViews.add(victim);
if (hasListener) {
mRecyclerListener.onMovedToScrapHeap(victim);
}
}
}
pruneScrapViews();
}
/**
* Move all views remaining in mActiveViews to mScrapViews.
*/
void scrapActiveViews() {
final View[] activeViews = mActiveViews;
final boolean hasListener = mRecyclerListener != null;
final boolean multipleScraps = mViewTypeCount > 1;
ArrayList<View> scrapViews = mCurrentScrap;
final int count = activeViews.length;
for (int i = count - 1; i >= 0; i--) {
final View victim = activeViews[i];
if (victim != null) {
int whichScrap = ((TwoWayAbsListView.LayoutParams) victim.getLayoutParams()).viewType;
activeViews[i] = null;
if (!shouldRecycleViewType(whichScrap)) {
// Do not move views that should be ignored
if (whichScrap != ITEM_VIEW_TYPE_HEADER_OR_FOOTER) {
removeDetachedView(victim, false);
}
continue;
}
if (multipleScraps) {
scrapViews = mScrapViews[whichScrap];
}
victim.onStartTemporaryDetach();
scrapViews.add(victim);
if (hasListener) {
mRecyclerListener.onMovedToScrapHeap(victim);
}
if (ViewDebug.TRACE_RECYCLER) {
ViewDebug.trace(victim,
ViewDebug.RecyclerTraceType.MOVE_FROM_ACTIVE_TO_SCRAP_HEAP,
mFirstActivePosition + i, -1);
}
}
}
pruneScrapViews();
}
/**
* Put a view into the ScrapViews list. These views are unordered.
*
* @param scrap
* The view to add
*/
@SuppressLint ( "NewApi" )
public void addScrapView( View scrap, int position ) {
AbsHListView.LayoutParams lp = (AbsHListView.LayoutParams) scrap.getLayoutParams();
if ( lp == null ) {
return;
}
lp.scrappedFromPosition = position;
// Don't put header or footer views or views that should be ignored
// into the scrap heap
int viewType = lp.viewType;
final boolean scrapHasTransientState = android.os.Build.VERSION.SDK_INT >= 16 ? scrap.hasTransientState() : false;
if ( !shouldRecycleViewType( viewType ) || scrapHasTransientState ) {
if ( viewType != ITEM_VIEW_TYPE_HEADER_OR_FOOTER || scrapHasTransientState ) {
if ( mSkippedScrap == null ) {
mSkippedScrap = new ArrayList<View>();
}
mSkippedScrap.add( scrap );
}
if ( scrapHasTransientState ) {
if ( mTransientStateViews == null ) {
mTransientStateViews = new SparseArrayCompat<View>();
}
scrap.onStartTemporaryDetach();
mTransientStateViews.put( position, scrap );
}
return;
}
scrap.onStartTemporaryDetach();
if ( mViewTypeCount == 1 ) {
mCurrentScrap.add( scrap );
} else {
mScrapViews[viewType].add( scrap );
}
if ( android.os.Build.VERSION.SDK_INT >= 14 ) {
scrap.setAccessibilityDelegate( null );
}
if ( mRecyclerListener != null ) {
mRecyclerListener.onMovedToScrapHeap( scrap );
}
}
/**
* Move all views remaining in mActiveViews to mScrapViews.
*/
@SuppressLint ( "NewApi" )
public void scrapActiveViews() {
final View[] activeViews = mActiveViews;
final boolean hasListener = mRecyclerListener != null;
final boolean multipleScraps = mViewTypeCount > 1;
ArrayList<View> scrapViews = mCurrentScrap;
final int count = activeViews.length;
for ( int i = count - 1; i >= 0; i-- ) {
final View victim = activeViews[i];
if ( victim != null ) {
final AbsHListView.LayoutParams lp = (AbsHListView.LayoutParams) victim.getLayoutParams();
int whichScrap = lp.viewType;
activeViews[i] = null;
final boolean scrapHasTransientState = android.os.Build.VERSION.SDK_INT >= 16 ? victim.hasTransientState() : false;
if ( !shouldRecycleViewType( whichScrap ) || scrapHasTransientState ) {
// Do not move views that should be ignored
if ( whichScrap != ITEM_VIEW_TYPE_HEADER_OR_FOOTER ||
scrapHasTransientState ) {
removeDetachedView( victim, false );
}
if ( scrapHasTransientState ) {
if ( mTransientStateViews == null ) {
mTransientStateViews = new SparseArrayCompat<View>();
}
mTransientStateViews.put( mFirstActivePosition + i, victim );
}
continue;
}
if ( multipleScraps ) {
scrapViews = mScrapViews[whichScrap];
}
victim.onStartTemporaryDetach();
lp.scrappedFromPosition = mFirstActivePosition + i;
scrapViews.add( victim );
if ( android.os.Build.VERSION.SDK_INT >= 14 ) {
victim.setAccessibilityDelegate( null );
}
if ( hasListener ) {
mRecyclerListener.onMovedToScrapHeap( victim );
}
}
}
pruneScrapViews();
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
void scrapActiveViews() {
final View[] activeViews = mActiveViews;
final boolean hasListener = mRecyclerListener != null;
final boolean multipleScraps = mViewTypeCount > 1;
ArrayList<View> scrapViews = mCurrentScrap;
final int count = activeViews.length;
for (int i = count - 1; i >= 0; i--) {
final View victim = activeViews[i];
if (victim != null) {
final LayoutParams lp = (LayoutParams) victim
.getLayoutParams();
int whichScrap = lp.viewType;
activeViews[i] = null;
final boolean scrapHasTransientState = Build.VERSION.SDK_INT >= 16 ? victim
.hasTransientState() : false;
if (!shouldRecycleViewType(whichScrap)
|| scrapHasTransientState) {
if (whichScrap != ITEM_VIEW_TYPE_HEADER_OR_FOOTER
&& scrapHasTransientState) {
removeDetachedView(victim, false);
}
if (scrapHasTransientState) {
if (mAdapter != null && mAdapterHasStableIds) {
if (mTransientStateViewsById == null) {
mTransientStateViewsById = new LongSparseArray<View>();
}
long id = mAdapter
.getItemId(mFirstActivePosition + i);
mTransientStateViewsById.put(id, victim);
} else {
if (mTransientStateViews == null) {
mTransientStateViews = new SparseArrayCompat<View>();
}
mTransientStateViews.put(mFirstActivePosition
+ i, victim);
}
}
continue;
}
if (multipleScraps) {
scrapViews = mScrapViews[whichScrap];
}
victim.onStartTemporaryDetach();
lp.scrappedFromPosition = mFirstActivePosition + i;
scrapViews.add(victim);
if (hasListener) {
mRecyclerListener.onMovedToScrapHeap(victim);
}
}
}
pruneScrapViews();
}