Да, возможно, но, возможно, не для фрагментов. Фрагменты, которые вы должны позволить им сделать свой жизненный цикл и должным образом уважать его.
Но я уверен, что вы сможете достичь вида-рециркуляции, используя вместо этого обычный 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
.
Это похоже на правильное направление, но на второй странице не отображаются никакие виды, хотя на первой странице отображается вид –
Я знаю, что это работает, потому что в моем приложении 'getCount()' есть сотни, а потому, что это только 'ImageView «Я не хотел для них цельного фрагмента. Вам нужно будет отлаживать шаг за шагом, чтобы увидеть, где он не работает. Также google для «представлений адаптера viewpager», чтобы получить некоторые другие примеры. – Budius
это в основном работает в прямом направлении, так как destroyItem() вызывается перед instantiateItem(), где объекты перерабатываются, но если я прокручиваю обратный метод instantiateItem(), сначала нужно вызвать вызов, возможно, мне нужно проверить направление и хранить дополнительные виды буфера. –