Я задал этот вопрос более года назад и получил хорошие отзывы о том, как его реализовать, но этот проект был заброшен. Сейчас он всплыл на поверхность, и я вновь разжигаю этот огонь.
Ближайший ответ, который я получил, находится здесь: Android ViewPager: Move любую страницу программно завершать?
По сути, я пытаюсь изменить порядок фрагментов представления (и добавить новые фрагменты представления) на основе данных, которые я извлекаю из веб-службы. Решение, на которое я разместил ссылку выше, работает с FragmentPagerAdapter, но не работает с FragmentStatePagerAdapter. Когда я вызываю notifyDataSetChanged() после перестроения моего набора данных, при использовании FragmentStatePagerAdapter я получаю исключения outofbounds, потому что размер моего массива недостаточно велик. Если я изменю все, чтобы использовать FragmentPagerAdapter, я не получу это исключение, но я также не вижу правильно упорядоченные фрагменты.
вот мой фрагмент состояния страницы:
public class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
public int getItemId(int position) {
//
return Entries.contestEntries.get(position).entry_id;
}
@Override
public int getItemPosition(Object object) {
android.support.v4.app.Fragment f = (android.support.v4.app.Fragment)object;
for(int i = 0; i < getCount(); i++){
android.support.v4.app.Fragment fragment = getItem(i);
if(f.equals(fragment)){
return i;
}
}
return POSITION_NONE;
}
@Override
public android.support.v4.app.Fragment getItem(int position) {
int entryId = getItemId(position);
if(Entries.mItems.get(entryId) != null) {
return Entries.mItems.get(entryId);
}
Fragment f = ScreenSlidePageFragment.create(position);
Entries.mItems.put(entryId, f);
return f;
}
@Override
public int getCount() {
return Entries.contestEntries.size();
}
}
как вы можете видеть, я просто ссылаюсь на статические свойства своей активности (записи), потому что, когда я пытался вставить их в члены адаптера, это вообще не сработало.
вот соответствующие свойства из этого действия:
public static ViewPager mPager;
public static PagerAdapter mPagerAdapter;
public static HashMap<Integer, android.support.v4.app.Fragment> mItems = new HashMap<Integer, android.support.v4.app.Fragment>();
public static int CurrentEntryId;
public static ArrayList<ContestEntryModel> contestEntries;
Когда активность получает новый заказ, я в настоящее время просто делаю mItems.clear(), прежде чем вызывать notifyDataSetChanged(). Это отлично работает, но у меня есть две проблемы: 1) экран мигает, когда он перестраивает текущий фрагмент, и 2) это использует больше ресурсов, которые мне, вероятно, нужно использовать, поскольку я должен иметь возможность просто использовать фрагменты, которые уже построены.
способ, которым я сбрасываю конкурсEntries, заключается в получении строки JSON от веб-службы, затем gson'ing ее к моей модели, а затем сбросе ArrayList конкурсаEntries на это новое значение.
Я также пытался изменить порядок HashMap перед вызовом notifyDataSetChanged(), и это не сработало.
У меня нет проблем с изменением этого решения для использования FragmentPagerAdapter() из FragmentStatePagerAdapter(), если это необходимо для выполнения этой работы, но, как я уже сказал выше, при тестировании, которое я провел вчера, не было переупорядочения фрагментов с использованием решения, опубликованного выше.
Любые предложения будут ценны.
ТИА