Android json viewpager动作栏fragmentpageadapter

时间:2014-02-07 14:36:50

标签: android json android-actionbar android-viewpager

我创建了action barviewpager,我有三个fragment。每个fragmentparsed json都可以显示每个listview。我的问题是:如果我clickfragment,那么当我转到下一个click时我会回去(fragmet第一个fragment然后我在这种情况下转到前面fragmentserver加载信息会出现两次,我使用AsyncTask课程从server加载信息。

以下是我的代码:

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();
        }

    }

}
  }

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

1 个答案:

答案 0 :(得分: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只会被调用一次。