ViewPager utlizing单个视图实例

时间:2015-06-08 11:50:41

标签: android

这是一个主观的问题,是否有可能让寻呼机适配器返回首先从xml文件(在我的自定义片段中)膨胀的相同视图实例,并且因为我的视图非常昂贵并且不会更改除外几个地区,我试图重复使用它?

我试图在我的Fragment类中创建一个静态成员,如果它尚未设置则返回它,但它不起作用,它是否反对Fragment生命周期?我很好,片段收集垃圾但我需要我的视图对象保留在那里,它有可能吗?

或者我应该在activity = gone中添加此视图并通过更改可见性返回它?

1 个答案:

答案 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