Как обновить содержимое фрагмента из активности (viewpager)?

У меня есть простой viewPager с двумя фрагментами. Каждый фрагмент содержит TextView. Я хотел бы иметь возможность обновлять текст текущего textView, отображаемый в действии.

Мероприятия :

public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); ArrayList<Fragment> fragments = new ArrayList<Fragment>(); fragments.add(Fragment.instantiate(this, Live.class.getName())); fragments.add(Fragment.instantiate(this, Hit.class.getName())); this.pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(),fragments); ViewPager pager = (ViewPager) findViewById(R.id.viewpager); pager.setAdapter(pagerAdapter); } } 

Адаптер:

 public class MyPagerAdapter extends FragmentPagerAdapter { private final ArrayList<Fragment> fragments; public MyPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragments) { super(fm); this.fragments = fragments; } @Override public Fragment getItem(int position) { return this.fragments.get(position); } @Override public int getCount() { return this.fragments.size(); } } 

Фрагмент:

 public class Live extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.live, container,false); } } 

Фрагмент XML:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_height="fill_parent" android:layout_width="fill_parent" android:text="First Fragment" android:id="@+id/status"/> </LinearLayout> 

Каждый фрагмент имеет TextView с идентификатором «status». Обновление текстового представления в onCreateView работает. Но как я могу обновить textView из любой точки действия?

Я пробовал это без успеха:

Фрагмент:

 public class Live extends Fragment { public TextView tv; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.live, container,false); tv = (TextView) view.findViewById(R.id.status); return view; } } 

Мероприятия :

 @Override protected void onResume() { super.onResume(); Live frag = (Live) pagerAdapter.getItem(0); frag.tv.setText("Test 2"); } 

Но это дает мне nullPointerException на tv , возможно потому, что фрагмент еще не завышен.

Я уже без проблем прочитал следующие вопросы:

  • Обновление фрагментов из Activity в ViewPager
  • Обновление TextView в ViewPager из другого фрагмента

Solutions Collecting From Web of "Как обновить содержимое фрагмента из активности (viewpager)?"

В вашем классе MyPagerAdapter Android вызывает getItem(...) только если он хочет создавать новые фрагменты. Таким образом, проблематично использовать ссылки там, вместо этого вы должны установить фрагменты.

Проверьте этот ответ support-fragmentpageradapter-hold-reference-to-old-fragments

Я решил эту проблему, как это, создать адаптер, как это

 package com.yubraj.sample.adapter; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import com.yubaraj.sample.activities.RashiFragment; import java.util.List; public class PageSliderAdapter extends FragmentStatePagerAdapter { static String[] titleList = new String[] { "today", "this month", "this year" }; List<String> rashi; // private static String TAG = "pagerscreenslider"; public PageSliderAdapter(FragmentManager fm, List<String> rashiList) { super(fm); this.rashi = rashiList; } public void updateData(List<String> rashisList){ rashi.clear(); this.rashi = rashisList; notifyDataSetChanged(); } @Override public int getItemPosition(Object object) { // TODO Auto-generated method stub return POSITION_NONE; } @Override public Fragment getItem(int position) { Fragment fragment = new RashiFragment(); Bundle bundle = new Bundle(); bundle.putString("RASHI", rashi.get(position)); bundle.putInt("RASHI_TYPE", position); fragment.setArguments(bundle); return fragment; } @Override public int getCount() { return titleList.length; } @Override public String getPageTitle(int position) { return titleList[position]; } } 

Затем из вашей деятельности

 List<String> rashiCollection = getJSONFromDb(Dates); adapter.updateData(rashiCollection); 
 @Override public int getItemPosition(Object object) { XXXFragment fragment = (XXXFragment) object; if(…condition){ fragment.refresh(…); } return super.getItemPosition(object); } 

Отмените описанное выше. Когда вы вызываете notifyDataSetChanged (), вызванный выше метод запускается. Сделайте свое обновление, как сможете.