Как обновить фрагмент Android из активности?

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

У меня есть следующий код, который был в основном создан мастером Android Project ADT:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(tag, "onCreate()::Entering..."); setContentView(R.layout.activity_main); // Set up the action bar. final ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // Create the adapter that will return a fragment for each of the // primary sections of the activity. mSectionsPagerAdapter = new SectionsPagerAdapter( getSupportFragmentManager()); // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mSectionsPagerAdapter); // When swiping between different sections, select the corresponding // tab. We can also use ActionBar.Tab#select() to do this if we have // a reference to the Tab. mViewPager .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { actionBar.setSelectedNavigationItem(position); } }); // For each of the sections in the app, add a tab to the action bar. for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { // Create a tab with text corresponding to the page title defined by // the adapter. Also specify this Activity object, which implements // the TabListener interface, as the callback (listener) for when // this tab is selected. actionBar.addTab(actionBar.newTab() .setText(mSectionsPagerAdapter.getPageTitle(i)) .setTabListener(this)); } 

Вот код, используемый для создания вкладок:

  public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { // getItem is called to instantiate the fragment for the given page. switch (position) { case FRAG1_POS: return Fragment1.newInstance(); case FRAG2_POS: return Fragment2.newInstance(); default: return null; } } 

Я попытался использовать это решение:

Как изменить текст textView фрагмента из активности

Но у меня нет идентификатора фрагмента. Могу ли я создавать теги? Если да, то как это сделать в этом случае? Другие сообщения SO упомянули Bundles, но я не отправляю данные при создании фрагмента; Я хочу периодически обновлять фрагмент, поскольку данные становятся доступными из Activity.

Вы не можете дать своим фрагментам тег или идентификатор, но вы можете создать собственное свойство в своем классе фрагмента, чтобы пометить их.

 switch (position) { case FRAG1_POS: Fragment1 f = Fragment1.newInstance(); f.fragmentType = 1; return f; case FRAG2_POS: Fragment1 f = Fragment1.newInstance(); f.fragmentType = 2; return f; default: return null; } 

Когда можно затем пропустить все фрагменты и найти тот, который вам нужен

 List<Fragment> allFragments = getSupportFragmentManager().getFragments(); if (allFragments != null) { for (Fragment fragment : allFragments) { Fragment1 f1 = (Fragment1)fragment; if (f1.fragmentType == 1) f1.updateFragmentData(); } } } 

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

Вот что вы можете попробовать:

Поскольку вы упоминаете обновление фрагмента из активности (с извлеченными данными), вы можете сделать что-то вроде этого:

В вашей Runnable или AsyncTask вы можете обновить адаптер с извлеченными данными и в своем фрагменте, вызвать метод onDatasetChanged () на адаптере, чтобы он автоматически обновлял представление.

Если у вас есть несколько фрагментов, внутри этих фрагментов вы можете определить интерфейс, а затем позволить его реализовать, а затем переопределить метод. Изнутри этого метода в операции обновите адаптер, который хранит данные. Вам нужно будет сделать адаптер статическим!

Надеюсь, это поможет!

Intereting Posts