Динамическое обновление ViewPager?

Я не могу обновить содержимое в ViewPager.

Как правильно использовать методы instanceItem() и getItem() в классе FragmentPagerAdapter?

Я использовал только getItem() для создания и возврата своих фрагментов:

@Override
public Fragment getItem(int position) {
    return new MyFragment(context, paramters);
}

Это сработало хорошо. За исключением того, что я не могу изменить содержимое.

Итак, я обнаружил это: ViewPager PagerAdapter не обновляет представление

«Мой подход заключается в использовании метода setTag() для любого экземпляра представления в методе instanceItem()»

Теперь я хочу реализовать instanceItem() для этого.Но я не знаю, что я должен вернуть (тип Object) и какова связь с getItem(int position)?

Я прочитал ссылку:

  • public abstract Fragment getItem (int position)

    Возврат фрагмента, связанного с указанной позицией.

  • public Object instanceItem (контейнер ViewGroup, позиция int)

    Создать страницу для данной позиции. Адаптер отвечает за добавление представления в указанный здесь контейнер, хотя он должен гарантировать, что это будет сделано только к моменту возврата из FinishUpdate(ViewGroup). Параметры

    container Представление, в котором будет отображаться страница. position Позиция страницы для создания экземпляра.

    Возвращает

    Возвращает объект, представляющий новую страницу. Это не обязательно должен быть вид, но может быть какой-то другой контейнер страницы.

но я до сих пор не понимаю.

Вот мой код. Я использую пакет поддержки v4.

ViewPagerTest

public class ViewPagerTest extends FragmentActivity {
    private ViewPager pager;
    private MyFragmentAdapter adapter; 

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pager1);

        pager = (ViewPager)findViewById(R.id.slider);

        String[] data = {"page1", "page2", "page3", "page4", "page5", "page6"};

        adapter = new MyFragmentAdapter(getSupportFragmentManager(), 6, this, data);
        pager.setAdapter(adapter);

        ((Button)findViewById(R.id.button)).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                reload();
            }
        });
    }

    private void reload() {
        String[] data = {"changed1", "changed2", "changed3", "changed4", "changed5", "changed6"};
        //adapter = new MyFragmentAdapter(getSupportFragmentManager(), 6, this, data);
        adapter.setData(data);
        adapter.notifyDataSetChanged();
        pager.invalidate();

        //pager.setCurrentItem(0);
    }
}

MyFragmentAdapter

class MyFragmentAdapter extends FragmentPagerAdapter {
    private int slideCount;
    private Context context;
    private String[] data;

    public MyFragmentAdapter(FragmentManager fm, int slideCount, Context context, String[] data) {
        super(fm);
        this.slideCount = slideCount;
        this.context = context;
        this.data = data;
    }

    @Override
    public Fragment getItem(int position) {
        return new MyFragment(data[position], context);
    }

    @Override
    public int getCount() {
        return slideCount;
    }

    public void setData(String[] data) {
        this.data = data;
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
}

MyFragment

public final class MyFragment extends Fragment {
    private String text;

    public MyFragment(String text, Context context) {
        this.text = text;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.slide, null);
        ((TextView)view.findViewById(R.id.text)).setText(text);

        return view;
    }
}

Вот тоже кто-то с похожей проблемой, ответов нет (скрыто)

302
задан Ixx 22 April 2019 в 05:50
поделиться