0

После этого вопроса:Фрагменты Update ViewPager из другого класса:

How to recreate all fragments in ViewPager:

У меня есть эти классы:

public class ViewPagerAdapter extends FragmentPagerAdapter 
{ 
private List<Fragment> fragments; 

/** 
* @param fm 
* @param fragments 
*/ 
public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) { 
    super(fm); 
    this.fragments = fragments; 
} 

/* (non-Javadoc) 
* @see android.support.v4.app.FragmentPagerAdapter#getItem(int) 
*/ 

@Override 
public Fragment getItem(int position) { 
    return this.fragments.get(position); 
} 

/* (non-Javadoc) 
* @see android.support.v4.view.PagerAdapter#getCount() 
*/ 

@Override 
public int getCount() { 
    return this.fragments.size(); 
} 

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

и FragmentActivity:

public class TabsViewPagerFragmentActivity extends FragmentActivity implements 
ViewPager.OnPageChangeListener, TabHost.OnTabChangeListener 
{ 
    static final String TAG = TabsViewPagerFragmentActivity.class.getSimpleName(); 
    private TabHost mTabHost; 
    private ViewPager mViewPager; 
    private HashMap<String, TabInfo> mapTabInfo = new HashMap<String,  TabsViewPagerFragmentActivity.TabInfo>(); 
    public ViewPagerAdapter mPagerAdapter; 
    ..... 

Сейчас в этом FragmentActivity У меня есть этот слушатель:

private class SlicerSelectedOnClickListener implements OnClickListener 
{ 
    private ODSharedSlicer slicer; 
    private int slicerIndex; 

    public SlicerSelectedOnClickListener(ODSharedSlicer slicer, int slicerIntex) 
    { 
     super(); 
     this.slicer = slicer; 
     this.slicerIndex = slicerIntex; 
    } 

    public void onClick(View v) 
    { 
     slicerOnClickConfiguration(slicerIndex, v); 
     mPagerAdapter.notifyDataSetChanged(); 
    } 
} 
    .... 

И это прекрасно работает notifyDataSetChanged() становится называются и осколки ViewPager в становятся воссозданы, как я хочу.

Проблема: Когда я пытаюсь вызвать метод notifyDataSetChanged() адаптера из другого класса (в моем случае это класс, который отвечает за синтаксический анализ данных, полученных от сервера) фрагменты остаются неизменными.

Я пытался сделать это: Я создал эти методы в моем FragmentActivity классе (один с ViewPager):

public void NotifyTabActivityViewPagerAdapter() 
{ 
    mPagerAdapter.notifyDataSetChanged(); 
} 

public ViewPagerAdapter getTabActivityViewPagerAdapter() 
{ 
    return mPagerAdapter; 
} 

public ViewPager getTabActivityViewPager() 
{ 
    return mViewPager; 
} 

И попытался следующие из второго класса:

((TabsViewPagerFragmentActivity)currentActivity).NotifyTabActivityViewPagerAdapter(); 

Or :

((TabsViewPagerFragmentActivity)currentActivity).getTabActivityViewPager().setAdapter(((TabsViewPagerFragmentActivity)currentActivity).getTabActivityViewPagerAdapter()); 

Но это не работает. Как ни странно, когда я запускаю это:

((TabsViewPagerFragmentActivity)currentActivity).getTabActivityViewPager().setAdapter(null); 

фрагменты действительно удаляются, но я не могу воссоздать новый набор фрагментов с новыми данными, полученными от стороны сервера.

Что мне здесь не хватает? Как мне воссоздать весь фрагмент в этом FragmentActivity из другого класса?

Любая помощь будет оценена по достоинству.

ответ

1

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

(1) interface

Если класс вы 're referring to is another Fragment и загружено в том же ViewPager способом, по которому вы должны обновлять данные (или вызывать метод) в другом Fragment или FragmentActivity с интерфейсом. Вы можете прокручивать нижнюю часть этой ссылки для некоторого примера кода, но в основном вы создаете мост между Fragment и активностью, которая содержит ViewPager (т. Е. Активность хоста фрагмента). Затем вы создаете «прослушиватель», который ищет некоторые изменения в Fragment, после чего он передает некоторую информацию в операцию по розыску.Затем активность хоста вызывает открытый метод во втором Fragment, который необходимо обновить. Единственная сложная задача здесь - запомнить инициализацию вашего «прослушивателя» интерфейса в вашем FragmentonAttach или он не будет работать.

(2) умысел

Если вы имеете дело с двумя отдельными деятельности просто использовать Intent. Передайте намерение FragmentActivity, которое вы ищете, и переопределите onNewIntent(Intent i), чтобы выполнить любую функцию, которую вы хотите в пределах класса.

Надеюсь, что это поможет - мне нужно было бы более конкретно ответить, потому что там много подзапросов.

+0

Фактически этот второй класс является вспомогательным классом и не распространяется на фрагмент или активность. И здесь есть только один вопрос: «Как мне воссоздать весь фрагмент в этой группе FragmentActivity из другого класса?» поток выглядит следующим образом: у меня есть пользовательский вид в моем FragmentActivity, пользовательский вид всплывает, выбирая опцию из этого всплывающего окна, запускает AsyncTask, который получает данные с сервера. Затем у меня есть вспомогательный класс (простой класс) который анализирует эти данные, и когда он заканчивается, я хотел бы запустить .notifyDataSetChanged(); из этого класса или каким-то другим способом, как это было у слушателя. –

+0

Хорошо, я этого не понимал раньше. Если вы класс, просто реализуете 'AsyncTack', почему вы не можете просто настроить обратный вызов между этим классом и его методом' onPostExecute'? – Rarw

+0

Потому что в onPostExecute я вызываю метод «ResponseHandler.ParseRecievedData (String data)», где «ResponseHandler» - это простой класс java, в котором хранятся все мои методы, связанные с веб-запросами AsyncTask. Я хочу сохранить это разделение. но я не могу раскрыть, как вызвать NotifyDataSetChanged() из класса ResponseHandler. Нужно ли что-то делать с контекстом Activity/Application? –

2

Я не думаю, что это так, и я думаю, что вы должны убедиться, что NotifyTabActivityViewPagerAdapter работает на onPostExecute, но у меня был проект, где notifyDataSetChange не работал и фрагмент оставался пустым. Чтобы решить эту проблему, я переопределить getItemPosition адаптер следующим образом:

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

Возвращая POSITION_NONE вы убедитесь, что адаптер обновить все данные.

+0

Вы можете увидеть из первого вопроса, что я разместил ссылку здесь: http://stackoverflow.com/questions/16671695/how-to-recreate-all-fragments-in-viewpager Я уже добавил этот метод к адаптеру. –

Смежные вопросы