2016-03-09 4 views
0

Я феллинг FragmentPagerAdapterFragmentPagerAdapter - Набор граф и названия асинхронной

public class GameListPagerAdapter extends FragmentPagerAdapter implements IGetGameListTaskListener { 

GameList _games; 
public int int_items = 6 ; 

public GameListPagerAdapter(FragmentManager fm) { 
    super(fm); 

    //async task to get a list of games 
    GetGameListTask getGamesTask = new GetGameListTask(this); 
    getGamesTask.execute(); 
} 

@Override 
public Fragment getItem(int position) 
{ 
    Bundle bundle = new Bundle(); 
    bundle.putInt("GameId", position); 

    //get the generic matchlistfragment and tell it which game it is 
    MatchListFragment matchListFragment = new MatchListFragment(); 
    matchListFragment.setArguments(bundle); 

    return matchListFragment; // always return the same fragment, just give it a different game id 
} 

@Override 
public int getCount() { 
    return int_items; 
} 

@Override 
public CharSequence getPageTitle(int position) { 

    //NEED HELP - Need to get the tiltle here 
    //return _games.getGames().get(position-1).getName(); 

    switch (position) { 
     case 0: 
      return "One"; 
     case 1: 
      return "Two"; 
     case 2: 
      return "Three"; 
     case 3: 
      return "Four"; 
     case 4: 
      return "Five"; 
     case 5: 
      return "Six"; 
    } 
    return null; 
} 



@Override 
public void onComplete(GameList data) { 
    //get the data on onPostExecute of my "getGamesTask" 
    _games = data; 

    //NEED HELP - need to set the item count here, but it fails** 
    //int_items = _games.getGames().size(); 
} 

}

Вот мой IGetGameListTaskListener интерфейс:

public interface IGetGameListTaskListener { 
    public void onComplete(GameList data); 
} 

Проблема у меня здесь, я получение списка игр из api, это настраивается как асинхронная задача GetGameListTask. Затем я хочу создать вкладку для каждой из игр, возвращенных в этом списке.

После того, как у меня есть список игр onComplete(GameList data) мне нужно установить int_items, а также int_items

Однако из-за (мое понимание) жизненного цикла FragmentPagerAdapter, эти значения нужно подавать авансом.

Как я смогу обработать эту реализацию асинхронных вкладок для моего FragmentPagerAdapter?

+1

Не создавать объект адаптера заранее. Создайте его в onPostExecute() или после получения результатов. После того, как вы получите результаты, вы можете отправить их как массив или список в конструктор адаптера и использовать их. –

+0

эй, почему бы не выполнить эту GetGameListTask getGamesTask = new GetGameListTask (this); перед вызовом GameListPagerAdapter? и после DoInBackGround Completes вы можете передать GamelIst и установить размер. Есть ли какая-либо проблема с этим подходом? –

+0

@ankitaggarwal это просто переводит проблему на мой просмотрщик. Теперь я должен выполнить фоновое задание в моем представлении перед настройкой viewPager.setAdapter –

ответ

1

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

GetGameListTask getGamesTask = new GetGameListTask(this); 
getGamesTask.execute(); 

В onPostExecute() из AsyncTask, сделать

@Override 
public void onPostExecute(){ 
    GameList games; 
    GameListPagerAdapter adapter = new GameListPagerAdapter(getFragmentManager(), games);  
    view_pager.setAdapter(adapter); 
} 

создать адаптер, как этот

public class GameListPagerAdapter extends FragmentPagerAdapter { 

    GameList _games; 
    public int int_items = 6 ; 

    public GameListPagerAdapter(FragmentManager fm, GameList _games) { 
     super(fm); 
     this._games = _games; 
    } 

    @Override 
    public Fragment getItem(int position) 
    { 
     Bundle bundle = new Bundle(); 
     bundle.putInt("GameId", position); 
     MatchListFragment matchListFragment = new MatchListFragment(); 
     matchListFragment.setArguments(bundle); 

     return matchListFragment; // always return the same fragment, just give it a different game id 
    } 

    @Override 
    public int getCount() { 
     return int_items; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return _games.get(position); 
    } 
} 
+0

снятый ... помеченный как ответ. –

0

Вместо возвращения

public int int_items = 6 ;

в

@Override public int getCount() { return int_items; }

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

+0

, как установлено, что значение не является проблемой. Моя проблема, как описано, заключается в том, что я получаю значения только после создания FragmentPageAdapter –