1

我的應用程序中有兩個listfragment和一個片段。我給你看第一個片段。asynctask後更新列表片段

應用程序啓動時,Asynctask檢索數據並將它們放入arrayNews中。 我認爲問題是listfragment中不刷新的listview或適配器的更新。

如果我改變手機的方向=> listfragment(+ listview)顯示正確。 如果我去片段3(片段2和3在內存中),然後回來片段1 =>它工作正常。

對不起,我的英語^^

public class MainActivity extends FragmentActivity implements ActionBar.TabListener 
{ 
    private SectionsPagerAdapter mSectionsPagerAdapter; 
    private ViewPager mViewPager; 
    public static ArrayList<Data> arrayNews = new ArrayList<Data>(); 

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

     List<Fragment> listeFragments = new Vector<Fragment>(); 
     listeFragments.add(Fragment.instantiate(this, ActualiteFragment.class.getName())); 
     listeFragments.add(Fragment.instantiate(this, DossierFragment.class.getName())); 
     listeFragments.add(Fragment.instantiate(this, ForumFragment.class.getName())); 
     mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(), listeFragments); 

     final ActionBar actionBar = getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 

     mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() 
     { 
      @Override 
      public void onPageSelected(int position) 
      { 
       actionBar.setSelectedNavigationItem(position); 
      } 
     }); 

     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) 
     { 
      actionBar.addTab(actionBar.newTab().setText(mSectionsPagerAdapter.getPageTitle(i)).setTabListener(this)); 
     } 

     if (arrayDossier.size() == 0 && arrayDossier.size() == 0) 
     { 
      chargement_donnees(); 
     }  
    } 

    public void chargement_donnees() 
    { 
     AsyncTaskChargement chargNews = new AsyncTaskChargement(); 
     chargNews.execute(); 
    } 

    public class AsyncTaskChargement extends AsyncTask<Void, Integer, Void> 
    { 
     private ProgressDialog dialog = new ProgressDialog(MainActivity.this); 

     @Override 
     protected void onPreExecute() 
     { 
      super.onPreExecute(); 
      dialog.setMessage("Chargement des données ..."); 
      dialog.setIndeterminate(true); 
      dialog.setCancelable(false); 
      dialog.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... arg0) 
     { 
      arrayNews = ContainerData_news.getFeeds(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) 
     { 
      if (this.dialog.isShowing()) 
      { 
       this.dialog.dismiss(); 
      } 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) 
    { 
     switch (item.getItemId()) 
     { 
     case R.id.menu_refresh: 
      chargement_donnees(); 
      return true; 
     default: 
      return false; 
     } 
    } 

    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) 
    { 
    } 

    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) 
    { 
     mViewPager.setCurrentItem(tab.getPosition()); 
    } 

    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) 
    { 
    } 

    public class SectionsPagerAdapter extends FragmentPagerAdapter 
    { 
     List<Fragment> listeFragments; 

     public SectionsPagerAdapter(FragmentManager fm, List<Fragment> listeFragments) 
     { 
      super(fm); 
      this.listeFragments = listeFragments; 
     } 

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

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

     @Override 
     public CharSequence getPageTitle(int position) 
     { 
      switch (position) 
      { 
      case 0: 
       return getString(R.string.title_section1).toUpperCase(); 
      case 1: 
       return getString(R.string.title_section2).toUpperCase(); 
      case 2: 
       return getString(R.string.title_section3).toUpperCase(); 
      } 
      return null; 
     } 
    } 

    public static class ActualiteFragment extends ListFragment 
    {  

     public ActualiteFragment() 
     { 
     } 

     @Override 
     public void onActivityCreated(Bundle savedInstanceState) 
     { 
      super.onActivityCreated(savedInstanceState); 
      setListAdapter(new AdapterListe(getActivity(), arrayNews)); 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     {   
      return inflater.inflate(R.layout.listfragment, container, false); 
     } 

     @Override 
     public void onListItemClick(ListView l, View v, int position, long id) 
     { 
      ... 
     } 
    } 
} 

回答

0

使用youradapter.notifyDataSetChanged();onPostExecute強迫你的列表的重繪。

+0

謝謝,但我嘗試在onPostExecute()中添加mSectionsPagerAdapter.notifyDataSetChanged(),但第一個選項卡的viewpager爲空。 – Arkin 2012-07-12 09:34:32

+0

使用「mViewPager.setOffscreenPageLimit(3);」裏面「保護無效onCreate(Bundle savedInstanceState){」 – Maurice 2014-04-07 13:55:35

2

我發現了一個簡單的方法來更新該名單 步驟是:1。 聲明onCreateView在ListFragment

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreateView(inflater, container, savedInstanceState); 
     View view = inflater.inflate(R.layout.TheLayoutContainingAListView, container, false); 
     return view;   
    } 

TheLayoutContainingAListView.xml應該只包含一個ListView

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
     <ListView 
      android:id="@android:id/list" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" > 
     </ListView> 
</LinearLayout> 

了Android :ID必須是「@android:id/list」。然而,你可以嘗試其他的東西..我沒.. 2.在您的AsyncTask的onPostExecute(的AsyncTask應該在MainActivity),做你想要做的一切..即宣佈一個適配器,setAdapter

protected void onPostExecute(String result) { 
      // TODO Auto-generated method stub 
      lv = (ListView) findViewById(android.R.id.list); 
      CustomAdapter adapt = new CustomAdapter(MainActivity.this, 
        android.R.id.list, fetch); //You can use ArrayAdapter.. i wanted a custom one 
      lv.setAdapter(adapt); 
      showFragment(YOUR Fragment, false); 

      super.onPostExecute(result); 
     } 

showFragment只是一個函數,我用來顯示特定的片段並隱藏所有其他片段。您可以通過FragmentTransaction show()和hide()方法輕鬆實現它。