这是一个主观的问题,是否有可能让寻呼机适配器返回首先从xml文件(在我的自定义片段中)膨胀的相同视图实例,并且因为我的视图非常昂贵并且不会更改除外几个地区,我试图重复使用它?
我试图在我的Fragment类中创建一个静态成员,如果它尚未设置则返回它,但它不起作用,它是否反对Fragment生命周期?我很好,片段收集垃圾但我需要我的视图对象保留在那里,它有可能吗?
或者我应该在activity = gone中添加此视图并通过更改可见性返回它?
答案 0 :(得分:1)
是的,这是可能的,但可能不是碎片。 片段你必须让他们做他们的生命周期的事情,并妥善尊重它。
但我非常确定您可以通过使用通用View
来实现视图回收。
我将向您展示一些关键部分,作为我在我的应用程序中使用的示例,您可以从中进一步开发,以满足您的需求。
请记住,这不是一个完整的代码,但应该让你开始。
public class ViewsAdapter extends PagerAdapter {
// Here we gonna save items to be recycled
private WeakHashMap<String, View> recycling
= new WeakHashMap<String, View>();
@Override
public Object instantiateItem(ViewGroup container, int position) {
// here you must return a valid initialised view
View view;
String[] keys = new String[recycling.size()];
keys = recycling.keySet().toArray(keys);
for (String key : keys) {
View recycledView = recycling.get(key);
if (recycledView == null) {
// remove dead elements
recycling.remove(key);
} else if (img.getParent() == null) {
// remove this object from recycling
recycling.remove(recycledView);
view = recycledView;
}
}
// create new if necessary
if (view == null)
view = // inflate your view here
// do any `position` based setup
view.setPosition(position); // for example
// add to the container
container.addView(view, 0);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
View view = (View) object;
// cancel any possible running operation on that view
view.cancelLoading(); // for example
// remove from container
container.removeView(View);
// recycle
recycling.put(Long.toString(random.nextLong() + System.currentTimeMillis()), View);
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view.equals(object);
}
}
ps:旁注。阅读这段代码,我很确定你可以通过使用某种类型的队列而不是WeakHashMap来改进它,可能是ArrayDeque
。