我目前正在开发一个使用ViewPager的应用程序,问题是我这样做的方式使得启动速度极慢并占用了大量的内存。
我正在实现这样的pageradapter:
public MyPagerAdapter(Context context) {
views = new ArrayList<RelativeLayout>();
views.add(new SliderLayout(context, "slide 8"));
views.add(new SliderLayout(context, "slide 1"));
views.add(new SliderLayout(context, "slide 2"));
views.add(new SliderLayout(context, "slide 3"));
views.add(new SliderLayout(context, "slide 4"));
views.add(new SliderLayout(context, "slide 5"));
views.add(new SliderLayout(context, "slide 6"));
views.add(new SliderLayout(context, "slide 7"));
views.add(new SliderLayout(context, "slide 8"));
views.add(new SliderLayout(context, "Slide 1"));
}
所有layoutobjects都包含一个带有textView的FrameLayout和一个包含带有本地html的webview的panel。所有布局都有唯一的内容,在实例化SliderLayout类时会加载和膨胀。
我还尝试在instantiateItem方法中动态添加视图,但这只会使滚动变得更加狡猾,并且如果我滚动得太快会给出OutOfMemory致命异常。
所以我的问题是,实现包含几个独特视图(但基于相同布局)的ViewPager的最佳方法是什么,所以它不会占用太多内存并且启动速度更快?
答案 0 :(得分:2)
您必须将您的视图附加到instantiateItem()中的寻呼机(就像您在常规适配器的getView()方法中那样)。在这种情况下,ViewPager会关注内存管理。在CompatibilityPackage中查看演示项目。实际上,你可以有数千页没有任何滞后。
@Override
public Object instantiateItem(View collection, int position) {
View v = layoutInflater.inflate(...);
...
((ViewPager) collection).addView(v,0);
return tv;
}
@Override
public void destroyItem(View collection, int position, Object view) {
((ViewPager) collection).removeView((TextView) view);
}
答案 1 :(得分:0)
嗯,我的想法是在ViewPager中捕获事件“onPageChanged()”并设置 页面更改后的webview - 或者,例如预加载页面,以便您拥有 “滚动效果”:您执行以下操作:
例如,您有10页的计数。如果您的viewpager位于第0页,那么您将实例化并加载页面0,1,2。如果您的viewpager在屏幕4,则删除webview 位置0,1和7,8,9 ...以这种方式你不需要webviews的所有实例(webkit消耗大量内存) 并有更多的记忆。