изменение порядка и добавление фрагментов в FragmentStatePagerAdapter без необходимости очистки списка элементов

Я задал этот вопрос более года назад и получил хорошие отзывы о том, как его реализовать, но этот проект был заброшен. Сейчас он всплыл на поверхность, и я вновь разжигаю этот огонь.

Ближайший ответ, который я получил, находится здесь: 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(), если это необходимо для выполнения этой работы, но, как я уже сказал выше, при тестировании, которое я провел вчера, не было переупорядочения фрагментов с использованием решения, опубликованного выше.

Любые предложения будут ценны.

ТИА


person Christopher Johnson    schedule 14.10.2014    source источник