2014-02-07 53 views
0

我已经创建了action barviewpager,我有三个fragment。每个fragment I parsed json并且可以显示每个listview。我的问题是:如果我clickfragment,然后我回去(click冷杉fragmet),当我去到下一个fragment,然后如果我去前面fragment在这种情况下,从server加载信息中出现了两次,我用AsyncTask类从server加载信息。Android json viewpager操作栏fragmentpageadapter

下面是我的代码:

public class TabsPagerAdapter extends FragmentPagerAdapter { 

public TabsPagerAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int index) { 

    switch (index) { 
    case 0: 

     return new SendItemsFragment(); 
    case 1: 

     return new RecivedItemsFragment(); 
    case 2: 

     return new FavoriteItemsFragment(); 

    } 

    return null; 
} 

@Override 
public int getCount() { 

    return 3; 
} 

public class MainActivity extends FragmentActivity implements TabListener { 

private ViewPager viewPager; 
private TabsPagerAdapter mAdapter; 
private ActionBar actionBar; 
private String[] tabs = { "test1", "test2", "test3" }; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    actionBar = getActionBar(); 
    actionBar.setHomeButtonEnabled(false); 
    actionBar.setDisplayHomeAsUpEnabled(true); 
    actionBar.setDisplayShowHomeEnabled(false); 
    actionBar.setDisplayShowTitleEnabled(false); 
    actionBar.setIcon(R.color.white); 
    actionBar.setDisplayShowTitleEnabled(true); 
    Drawable d = getResources().getDrawable(R.drawable.acttitle); 
    getActionBar().setBackgroundDrawable(d); 

    mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); 

    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM 
      | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); 

    viewPager = (ViewPager) findViewById(R.id.vp_main); 
    viewPager.setAdapter(mAdapter); 

    getActionBar().setCustomView(R.layout.menu_example); 
    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM 
      | ActionBar.DISPLAY_SHOW_HOME); 
    for (String tab_name : tabs) { 
     actionBar.addTab(actionBar.newTab().setText(tab_name) 
       .setTabListener(this)); 
    } 

    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     @Override 
     public void onPageSelected(int position) { 

      actionBar.setSelectedNavigationItem(position); 
     } 

     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 
     } 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 
     } 
    }); 

    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    // actionBar.setStackedBackgroundDrawable(getResources().getDrawable(
    // R.drawable.background)); background viewpager 

} 

@Override 
public void onTabReselected(Tab tab, FragmentTransaction ft) { 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 

    viewPager.setCurrentItem(tab.getPosition()); 
} 

@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
} 
    } 

这是 - 片段的代码之一。类似于他们三人。唯一的区别是来自服务器的数据加载,并且还使用AsyncTask类,每个类都有不同。

public class SendItemsFragment extends Fragment { 
private String URL = "*******************************************"; 

public static String KEY_title = "title"; 
public static String KEY_description = "description"; 
public static String KEY_image = "image"; 
public static String KEY_journal = "journal"; 
public static String KEY_JournalID = "JournalID"; 
public static String KEY_pubDate = "pubDate"; 
public static String KEY_statID = "statID"; 
public JSONArray jsonarray; 
public ListView list; 
public TransparentProgressDialog pd; 
public JSONParser jsonparser; 
static DealBoxAdapter adapter; 
ProgressDialog pDialog, pDialog1; 
static String fontPath2 = "font.ttf"; 
public static Typeface tf2; 
ArrayList<HashMap<String, String>> itemList = new ArrayList<HashMap<String, String>>(); 
public ImageLoader imageLoader; 
static final int DIALOG_ERROR_CONNECTION = 1; 
private int screenSize; 
private LoadDataAllChanelsToServer loader; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.send_items, container, false); 
    list = (ListView) rootView.findViewById(R.id.listView1); 
    pd = new TransparentProgressDialog(getActivity(), R.drawable.loader); 
    screenSize = getResources().getConfiguration().screenLayout 
      & Configuration.SCREENLAYOUT_SIZE_MASK; 
    loader=new LoadDataAllChanelsToServer(); 

    loader.execute(); 
    return rootView; 
} 

private class LoadDataAllChanelsToServer extends 
     AsyncTask<String, Integer, String> { 

    @Override 
    protected void onPreExecute() { 

     pd.show(); 
    } 

    @Override 
    protected String doInBackground(String... urls) { 

     jsonparser = new JSONParser(); 

     JSONObject jsonobject = jsonparser.getJSONfromURL(URL); 
     try { 

      jsonarray = jsonobject.getJSONArray("data"); 

      for (int i = 0; i < jsonarray.length(); i++) { 
       jsonobject = jsonarray.getJSONObject(i); 

       HashMap<String, String> map = new HashMap<String, String>(); 

       map.put("journal", jsonobject.getString(KEY_journal)); 
       map.put("image", jsonobject.getString(KEY_image)); 
       map.put("title", jsonobject.getString(KEY_title)); 
       map.put("description", 
         jsonobject.getString(KEY_description)); 
       map.put("JournalID", jsonobject.getString(KEY_JournalID)); 
       map.put("pubDate", jsonobject.getString(KEY_pubDate)); 
       map.put("statID", jsonobject.getString(KEY_statID)); 

       itemList.add(map); 

      } 

     } catch (JSONException e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 

     return itemList.toString(); 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     try { 
      if (pd != null) { 
       pd.dismiss(); 

      } 
     } catch (Exception e) { 

     } 

     try { 
      adapter = new DealBoxAdapter(getActivity(), itemList, 
        screenSize); 
      list.setAdapter(adapter); 

     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } 

    } 

} 
    } 

这是所有:) 如果有人知道的解决方案,请帮助我 谢谢

回答

0

您应该取消异步任务时,你Fragment被破坏。

private LoadDataAllChanelsToServer mLoader; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
    ... 
    mLoader = new LoadDataAllChanelsToServer(); 
    mLoader.execute(); 
    ... 
} 

@Overide 
public onDestroy() { 
    super.onDestroy(); 

    if(mLoader != null) { 
     mLoader.cancel(true); 
     mLoader = null; 
} 

这样,当片段被销毁AsyncTask将被取消。您也可以设置ViewPager.setOffscreenPageLimit(2)。这样,由于您只有3 Fragments,因此不会破坏Fragments,因此您的onViewCreated只会被调用一次。

+0

我加了这个onDestroy方法,但是我只有第一个片段有问题 – user3272799

+0

我的不好。我的答案的第一部分应该解决'postExecute'中不必要的'try cache'块。你尝试过'ViewPager.setOffscreenPageLimit(2)'。如果我正确理解你的问题,这应该是解决方案。 – Blaz

+0

我不明白你我添加onDestroy方法只与try catch,我不明白是什么意思ViewPager.setOffscreenPageLimit(2)。这意味着我可以添加此? – user3272799