Как отключить предварительную загрузку в представлении?
Как отключить предварительную загрузку в viewpager?
У меня есть viewpager с 3 страницами. Поэтому я не хочу загружать следующую страницу и предыдущую страницу. Как я могу отключить это поведение?
Ответы
Ответ 1
Как отключить предварительную загрузку в ViewPager?
это невозможно. ViewPager предварительно загружает не менее 1 страницы. Если вы не хотите этого поведения, вы не должны использовать ViewPager. Вы можете использовать, например, RecyclerView
Старый ответ
вам нужно вызвать setOffscreenPageLimit (1)
Из документа
Задайте количество страниц, которые должны быть сохранены по обе стороны от текущей страницы в иерархии представлений в состоянии ожидания. Страницы за пределами этого предел будет воссоздан из адаптера, если это необходимо.
Ответ 2
Ну, похоже, это немного сложнее, чем можно было бы подумать.
Код ниже представляет собой абстрактный класс, который должен быть реализован вашим фрагментом.
На самом деле это требует:
- Заменить onActivityCreated с помощью lazyOnActivityCreated.
- Реализовать метод lazyLoadData, который загружает данные для вкладки.
- После загрузки данных или по какой-либо причине вы изменили активный вызов данных setTabDataId.
Я знаю, что это звучит немного сложно, но он работает каждый раз и определенно будет работать, когда setUserHint не подходит.
Вот абстрактный класс:
public abstract class LazyFetchTabFragment extends AbstractTabFragment {
private String tabDataId;
private String activeTabDataId;
private boolean isActive = false;
private boolean isCreated = false;
@Override
public void onStop(){
super.onStop();
isCreated = false;
activeTabDataId = null;
}
/**
* An abstract method that should be called instead of {@link android.app.Fragment#onActivityCreated(Bundle)}.
*/
public abstract void lazyOnActivityCreated() throws Exception;
public abstract void lazyLoadData() throws Exception;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
try {
lazyOnActivityCreated();
isCreated = true;
loadData();
} catch (Exception e) {
Log.e(this.getClass().getCanonicalName() + " - "
+ Thread.currentThread().getStackTrace()[2].getMethodName(), e.toString());
}
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
// When changing tabs the spinner setOnItemSelectedListener is not called,
// so use code below to trigger loading data.
isActive = isVisibleToUser;
loadData();
}
private void loadData(boolean force) {
if (isActive && isCreated && tabDataId != null &&
(force || (activeTabDataId == null || !activeTabDataId.equals(tabDataId))))
try {
lazyLoadData();
activeTabDataId = tabDataId;
} catch (Exception ex){
Log.e(this.getClass().getCanonicalName() + " - "
+ Thread.currentThread().getStackTrace()[2].getMethodName(), ex.toString());
}
}
public void setTabDataId(String tabDataId) {
this.tabDataId = tabDataId;
}
Удачи!
Ответ 3
Я изменяю исходный код ViewPager
private static final int DEFAULT_OFFSCREEN_PAGES = 0;
Вы можете найти источник в ViewPager о setOffscreenPageLimit
public void setOffscreenPageLimit(int limit) {
if (limit < DEFAULT_OFFSCREEN_PAGES) {
Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " +
DEFAULT_OFFSCREEN_PAGES);
limit = DEFAULT_OFFSCREEN_PAGES;
}
if (limit != mOffscreenPageLimit) {
mOffscreenPageLimit = limit;
populate();
}
}