public
class
ViewRecycler
{
private
SparseArray<View> recycleViews;
private
View[] activeViews =
new
View[
0
];
public
ViewRecycler()
{
recycleViews =
new
SparseArray<View>();
}
/** 获取活动view的总数 */
public
void
getCount(
int
count)
{
final
int
length =
this
.activeViews.length;
if
(count > length)
{
final
View[] activeViews =
this
.activeViews;
this
.activeViews = Arrays.copyOf(activeViews, count);
}
}
/** 添加记录当前活动的view */
public
void
addActiveView(
int
position, View view)
{
final
int
length =
this
.activeViews.length;
if
(position > length -
1
)
{
getCount(position +
1
);
}
this
.activeViews[position] = view;
}
/** 获取某个活动view */
public
View getActiveView(
int
position)
{
final
int
length =
this
.activeViews.length;
if
(position > length -
1
)
{
getCount(position +
1
);
}
return
activeViews[position];
}
/** 获取废弃的view */
View getRecycleView(
int
position)
{
return
retrieveFromRecycle(recycleViews, position);
}
/** 检索废弃的view */
static
View retrieveFromRecycle(SparseArray<View> recycleViews,
int
position)
{
int
size = recycleViews.size();
if
(size >
0
)
{
for
(
int
i =
0
; i < size; i++)
{
int
fromPosition = recycleViews.keyAt(i);
View view = recycleViews.get(fromPosition);
if
(fromPosition == position)
{
recycleViews.remove(fromPosition);
return
view;
}
}
int
index = size -
1
;
View r = recycleViews.valueAt(index);
recycleViews.remove(recycleViews.keyAt(index));
return
r;
}
else
{
return
null
;
}
}
/** 添加废弃的view,无序添加 */
void
addRecycleView(
int
position, View scrap)
{
recycleViews.put(position, scrap);
final
int
length =
this
.activeViews.length;
if
(position < length)
{
this
.activeViews[position] =
null
;
}
pruneRecycleViews();
}
/** 将所有剩余的活动view移到废弃view里 */
void
recycleAllActiveViews()
{
final
View[] activeViews =
this
.activeViews;
SparseArray<View> recycleViews =
this
.recycleViews;
final
int
count = activeViews.length;
for
(
int
i = count -
1
; i >=
0
; i--)
{
final
View victim = activeViews[i];
if
(victim !=
null
)
{
activeViews[i] =
null
;
recycleViews.put(i, victim);
}
}
pruneRecycleViews();
}
/** 确保废弃的view不多于活动的view容器的总数量 */
private
void
pruneRecycleViews()
{
final
int
maxViews = activeViews.length;
int
size = recycleViews.size();
final
int
extras = size - maxViews;
size--;
for
(
int
j =
0
; j < extras; j++)
{
recycleViews.remove(recycleViews.keyAt(size--));
}
}
}