2

Я новичок в программировании на Android.
Я googled & stackoverflowed, прочитал android docs, но ничего не помогло мне, или, может быть, я не очень хорошо понял.

Как AsyncTask для фрагментов из onPageSelected ViewPager?

Я пытаюсь использовать интерфейс AsyncTask для фрагментации через onPageSelected from ViewPager.

Как AndroMoney приложение ViewPager (до onPageSelected, она показывает "загрузка ...", когда onPageSelected, он AsyncTasked и загружен.):

AndroMoney ViewPager Fragment Screenshoot


но мой код является: он асинтегрируется во время разворота и иногда останавливается между двумя фрагментами следующим образом:

my code viewpager screenshot


В отличие от приложения AndroMoney мой код не asynctask onPageSelected.

здесь MyFragment.java:

public class MyFragment extends Fragment { 
    public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE"; 
    final StringBuilder buffer=new StringBuilder(); 
    View v; 
    public static final MyFragment newInstance(int message) { 
     MyFragment f = new MyFragment(); 
     Bundle bdl = new Bundle(1); 
     bdl.putInt(EXTRA_MESSAGE, message); 
     f.setArguments(bdl); 
     return f; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     v = inflater.inflate(R.layout.myfragment_layout, container, false); 
     new AsyncDatabase().execute(); 
     return v; 
    } 

    public class AsyncDatabase extends AsyncTask<Void,Void,Void>{ 
     @Override 
     protected Void doInBackground(Void... params){ 
      int message = getArguments().getInt(EXTRA_MESSAGE); 
      BibleService bService=new BibleServiceImpl(getActivity().getApplication()); 
      List<Bible> bible=bService.getBibleByChapterNumber("Salm", message); 
      for(Bible b: bible){ 
       for(int i=0;i<10;i++){ 
        buffer.append(b); 
       } 
      } 
      return null; 
     } 
     @Override 
     protected void onPostExecute(Void result){ 
      TextView txt1=(TextView)v.findViewById(R.id.textView1); 
      TextView txt2=(TextView)v.findViewById(R.id.textView2); 
      txt1.setText("Done"); 
      txt2.setText(buffer.toString()); 
     } 
     @Override 
     protected void onPreExecute(){ 
      TextView txt1=(TextView)v.findViewById(R.id.textView1); 
      txt1.setText("Loading..."); 
     } 
     @Override 
     protected void onProgressUpdate(Void... values){ 

     } 
    } 


} 

здесь PageViewActivity.java:

public class PageViewActivity extends FragmentActivity{ 
    MyPageAdapter pageAdapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_page_view); 

     List<Fragment> fragments = getFragments(); 

     pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments); 

     ViewPager pager = (ViewPager) findViewById(R.id.viewpager); 
     pager.setOffscreenPageLimit(1); 
     pager.setAdapter(pageAdapter); 
     pager.setCurrentItem(11); 

     pager.setOnPageChangeListener(new OnPageChangeListener() { 
      public void onPageScrollStateChanged(int state) { 

      } 

      public void onPageScrolled(int position, float positionOffset, 
        int positionOffsetPixels) { 
      } 

      public void onPageSelected(int position) { 

      } 
     }); 

    } 

    private List<Fragment> getFragments() { 
     List<Fragment> fList = new ArrayList<Fragment>(); 

     for (int j = 2; j < 150; j++) { 
      fList.add(MyFragment.newInstance(j)); 
     } 

     return fList; 
    } 

    private class MyPageAdapter extends FragmentStatePagerAdapter { 
     private List<Fragment> fragments; 

     public MyPageAdapter(FragmentManager fm, List<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 void onPageSelected(int position) { 
       new MyFragment().new AsyncDatabase().execute(); 
      } 

Это не work.:-P

Итак, как AsyncTask фрагменту из onPageSelected из PageViewActivity как AndroMoney приложение.

ответ

0

Expose новый метод в фрагменте:

public void executeAsyncTask() { 
    new AsyncDatabase().execute(); 
} 


В своей деятельности, сделать свой список фрагментов финала, так что вы можете получить доступ к нему в адаптер:

final List<MyFragment> fragments = getFragments(); 


Затем измените метод onPageSelected() следующим образом:

public void onPageSelected(int position) { 
    fragments.get(position).executeAsyncTask(); 
} 


Вам также необходимо обновить MyPagerAdapter использовать MyFragment вместо фрагмента:

private class MyPageAdapter extends FragmentStatePagerAdapter { 
    private List<MyFragment> fragments; 

    public MyPageAdapter(FragmentManager fm, List<MyFragment> 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(); 
    } 

} 

private List<MyFragment> getFragments() { 
    List<MyFragment> fList = new ArrayList<MyFragment>(); 

    for (int j = 2; j < 150; j++) { 
     fList.add(MyFragment.newInstance(j)); 
    } 

    return fList; 
} 
Смежные вопросы