Intereting Posts
Android разнородный gridview как pinterest? Chromecast добавляет субтитры во время воспроизведения видео SecurityException с grantUriPermission при совместном использовании файла с FileProvider Добавление отступов / маржи к Spannable Как установить расширенные пользовательские атрибуты в файлах Android? Как узнать, что приложение установлено из игры Google или боковой загрузки? Получить реферер после установки приложения из Android Маркета Recycle view – java.lang.NullPointerException Ошибка: нестатический метод «findViewById (int)» не может ссылаться на статический контекст Создайте проект Eclipse с Android Git Как найти имя файла, который передается через прямой режим Wi-Fi в android? Сколько столбцов базы данных связано с SMS в андроиде? Тайм-аут активности для HistoryRecord? Как вызвать startactivity или вызвать намерение из события onitemclick списка в фрагменте? Как изменить иконки меню навигации и переполнения панели инструментов (appcompat v7)?

Обновить фрагмент из ViewPager

У меня есть Activity с ViewPager . У меня также есть Dialog которое будет извлекать список с некоторыми элементами, которые пользователь выберет. Теперь, как я могу обновить Fragment где элементы должны отображаться как новые представления, прикрепленные к этому фрагменту?

Вот мой ViewPager :

 public static class MyAdapter extends FragmentPagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return 1; } @Override public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return new Fragment1(); default: return null; } } } 

Теперь вот Fragment :

 public class Fragment1 extends Fragment{ @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); } @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); } @Override public ViewGroup onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub ViewGroup view = (ViewGroup)inflater.inflate(R.layout.screen1, container, false); } return view; } } 

Это метод, который я хочу использовать для добавления элементов в мой Fragment

 private void addItem() { // Instantiate a new "row" view. final ViewGroup[] newViews = new ViewGroup[selectedItems.length]; for(int i = 0; i < selectedItems.length; i++){ newViews[i] = (ViewGroup) LayoutInflater.from(this).inflate( R.layout.animated_layout_item, mContainerView, false); // Set the text in each new row. ((TextView) newViews[i].findViewById(android.R.id.text1)).setText(selectedItems[i]); // Because mContainerView has android:animateLayoutChanges set to true, // adding this view is automatically animated. mContainerView.addView(newViews[i], 0); // Set a click listener for the "X" button in the row that will remove the row. OnClickListener listener = new MyAddItemListener(newViews[i], mContainerView, this); newViews[i].findViewById(R.id.delete_button).setOnClickListener(listener); } } 

Solutions Collecting From Web of "Обновить фрагмент из ViewPager"

Обновить фрагмент из ViewPager

Вам необходимо реализовать getItemPosition(Object obj) .

Этот метод вызывается, когда вы вызываете

 notifyDataSetChanged() 

На вашем ViewPagerAdaper . Неявно этот метод возвращает значение POSITION_UNCHANGED что означает что-то вроде этого: «Фрагмент – это то, где он должен быть, поэтому ничего не меняйте».

Поэтому, если вам нужно обновить Fragment, вы можете сделать это с помощью:

  • Всегда возвращайте метод POSITION_NONE из getItemPosition() . Это означает: «Фрагмент должен всегда воссоздаваться»
  • Вы можете создать некоторый метод update (), который будет обновлять ваш фрагмент (фрагмент будет обрабатывать сами обновления)

Пример второго подхода:

 public interface Updateable { public void update(); } public class MyFragment extends Fragment implements Updateable { ... public void update() { // do your stuff } } 

И в FragmentPagerAdapter вы сделаете что-то вроде этого:

 @Override public int getItemPosition(Object object) { MyFragment f = (MyFragment ) object; if (f != null) { f.update(); } return super.getItemPosition(object); } 

И если вы выберете первый подход, это может выглядеть так:

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

Примечание. Стоит подумать о том, какой подход вы поднимете.

Я столкнулся с проблемой несколько раз, чтобы в этом случае всегда избегать FragmentPagerAdapter и использовать FragmentStatePagerAdapter.

Это работает для меня. Надеюсь, это сработает и для вас.

Я реализую демонстрацию приложения после ответа Саймона. Только для тех, кто ищет этот вопрос.

Вы можете получить исходный код на GitHub

Введите описание изображения здесь

В вашем PagerAdapter переопределить getItemPosition

 @Override public int getItemPosition(Object object) { // POSITION_NONE makes it possible to reload the PagerAdapter return POSITION_NONE; } 

После этого добавьте viewPager.getAdapter (). NotifyDataSetChanged (); Этот код, как показано ниже

 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { viewPager.getAdapter().notifyDataSetChanged(); } @Override public void onPageScrollStateChanged(int state) { } }); 

должно сработать.

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

Просто сообщите об этом своему адаптеру , он работает потрясающе,

Код ссылки

  void setAdapter(int position) { PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(pagerAdapter); // when notify then set manually current position. viewPager.setCurrentItem(position); pagerAdapter.notifyDataSetChanged(); } 

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

В своем фрагменте добавьте этот код для обновления

 ((YourActivityName) getContext()).setAdapter(selectedTabPosition); 

Используйте instanceof для контекста трансляции.

Этот общий код помогает только тем, кто находит решение.

Вы можете обновить фрагмент двумя способами,

Первый путь

Как @ Саймон

Вам необходимо реализовать getItemPosition(Object obj) .

Этот метод вызывается, когда вы вызываете

 notifyDataSetChanged() 

Вы можете найти пример в Github и получить дополнительную информацию в этом сообщении .

Введите описание изображения здесь

Второй путь

Мой подход к обновлению фрагментов в viewpager заключается в использовании метода setTag() для любого инстанцированного представления в методе instantiateItem() . Поэтому, когда вы хотите изменить данные или сделать недействительными требуемое представление, вы можете вызвать метод findViewWithTag() на ViewPager, чтобы получить ранее созданное представление и изменить / использовать его, как вы хотите, без необходимости удаления / создания нового представления Каждый раз, когда вы хотите обновить некоторое значение.

 @Override public Object instantiateItem(ViewGroup container, int position) { Object object = super.instantiateItem(container, position); if (object instanceof Fragment) { Fragment fragment = (Fragment) object; String tag = fragment.getTag(); mFragmentTags.put(position, tag); } return object; } public Fragment getFragment(int position) { Fragment fragment = null; String tag = mFragmentTags.get(position); if (tag != null) { fragment = mFragmentManager.findFragmentByTag(tag); } return fragment; } 

Вы можете найти пример в Github или более подробную информацию в этом сообщении :

Введите описание изображения здесь

Возможно, ваш метод добавления элементов в фрагмент должен быть общедоступным (помещен в желаемый фрагмент) и должен иметь параметр того же типа, что и selectedItems ..

Это сделает его видимым из активности, в котором будет выбран массив элементов и voila.

Ps лучше называть его addItemsFromArray(typeOfSelectedItems[] pSelectedItems) вызвать имя addItem() довольно неописательно

Редактировать: stackoverflow просто предложил аналогичную тему 🙂 Проверьте здесь, для детальной реализации идеи .. 🙂

Очень просто переопределить метод в фрагменте:

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(isVisibleToUser){ actionView(); } else{ //no } } 

Очень простое, но эффективное решение для обновления представлений фрагментов . Используйте setUserVisibleHint() . Он будет вызван, когда фрагмент будет видимым для пользователя. Там вы можете обновить наш вид ( setText() или setVisibility() и т. Д.)

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(isVisibleToUser){ //Write your code to be executed when it is visible to user } } 

Это сработало в моем случае. Надеюсь, поможет!

1) Создайте обработчик в фрагменте, который вы хотите обновить.

 public static Handler sUpdateHandler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... sUpdateHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); // call you update method here. } }; } 

2) В Activity / Fragment / Dialog, где бы вы не хотели, чтобы вызов обновления был запущен, получите ссылку на этот обработчик и отправьте сообщение (сообщив об обновлении вашего фрагмента)

 // Check if the fragment is visible by checking if the handler is null or not. Handler handler = TaskTabCompletedFragment.sUpdateHandler; if (handler != null) { handler.obtainMessage().sendToTarget(); }