2015-06-08 2 views
0

Это субъективный вопрос: возможно ли, чтобы адаптер пейджера возвращал тот же экземпляр вида, который сначала получил завышенное из xml-файла (внутри моего пользовательского фрагмента), и потому что мои взгляды очень дороги и не меняются, за исключением нескольких регионов, я пытаюсь его повторно использовать?ViewPager utlizing single instance of view

Я попытался создать статический член внутри моего класса Fragment и вернуть его, если он еще не установлен, но он не работает, не против жизненного цикла фрагмента? хорошо, я в порядке с Фрагментом, получающим сбор мусора, но мне нужно, чтобы мой объект обзора оставался там, возможно ли вообще?

Или я должен добавить этот вид в действие с видимостью = ушел и вернуть его, изменив видимость?

ответ

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.

+0

Это похоже на правильное направление, но на второй странице не отображаются никакие виды, хотя на первой странице отображается вид –

+0

Я знаю, что это работает, потому что в моем приложении 'getCount()' есть сотни, а потому, что это только 'ImageView «Я не хотел для них цельного фрагмента. Вам нужно будет отлаживать шаг за шагом, чтобы увидеть, где он не работает. Также google для «представлений адаптера viewpager», чтобы получить некоторые другие примеры. – Budius

+0

это в основном работает в прямом направлении, так как destroyItem() вызывается перед instantiateItem(), где объекты перерабатываются, но если я прокручиваю обратный метод instantiateItem(), сначала нужно вызвать вызов, возможно, мне нужно проверить направление и хранить дополнительные виды буфера. –

Смежные вопросы