Обновить ViewPager динамически?

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

Вопрос: Какова взаимосвязь и правильное использование методов instantiateItem () и getItem () в классе FragmentPagerAdapter?

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

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

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

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

В частности, в котором говорится о методе instantiateItem ():

"My approach is to use the setTag() method for any instantiated view in the instantiateItem() method"

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

В настоящее время я использую getItem для создания экземпляра фрагмента, это неправильно? Но тогда нужно ли помещать фрагменты в переменную экземпляра или вообще не реализовывать getItem () ...? Я просто не понимаю этого.

Я пытался читатьссылка:

public abstract Fragment getItem (int position)

Return the Fragment associated with a specified position.

public Object instantiateItem (ViewGroup container, int position)

Create the page for the given position. The adapter is responsible for adding the view to the container given here, although it only must ensure this is done by the time it returns from finishUpdate(ViewGroup). Parameters

container The containing View in which the page will be shown. position The page position to be instantiated.

Returns

Returns an Object representing the new page. This does not need to be a View, but can be some other container of the page.

... но я до сих пор не понимаю, как они связаны и что я должен делать.

Вот мой код. Я использую пакет поддержки 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;
    }
}

Вот еще кто-то с похожей проблемой, без ответов ...

http://www.mail-archive.com/[email protected]/msg200477.html

Ответы на вопрос(19)

Ваш ответ на вопрос