2014-10-16 35 views
0

我試圖實現動態更新ListFragment中的列表。 但是,當我改變我的片段(即從片段1到片段2並返回片段1)時,列表內容將丟失。ListView內容在分片更改後丟失

以下是我的ListFragment。

public class FragmentOne extends ListFragment { 

String[] order = new String[] {}; 

public FragmentOne(){} 

/** Items entered by the user is stored in this ArrayList variable */ 
ArrayList<String> list = new ArrayList<String>(); 

/** Declaring an ArrayAdapter to set items to ListView */ 
ArrayAdapter<String> adapter; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    final View rootView = inflater.inflate(R.layout.fragment_1, container, false); 

    /** Reference to the button of the layout main.xml */ 
    Button btn = (Button) rootView.findViewById(R.id.btnAdd); 
    /** Defining a click event listener for the button "Add" */ 
    OnClickListener listener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      EditText edit = (EditText) rootView.findViewById(R.id.txtItem); 
      list.add(edit.getText().toString()); 
      edit.setText(""); 
      adapter.notifyDataSetChanged(); 
     } 
    }; 

    /** Setting the event listener for the add button */ 
    btn.setOnClickListener(listener); 

    /** Defining the ArrayAdapter to set items to ListView */ 
    adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list); 

    /** Setting the adapter to the ListView */ 
    setListAdapter(adapter); 
    return rootView; 
}} 

編輯:

我是想實現一個滑塊菜單,這是我的活動(我很抱歉的代碼過長):

public class MainActivity extends FragmentActivity { 
private DrawerLayout mDrawerLayout; 
private ListView mDrawerList; 
private ActionBarDrawerToggle mDrawerToggle; 
// nav drawer title 
private CharSequence mDrawerTitle; 

// used to store app title 
private CharSequence mTitle; 

// slide menu items 
private String[] navMenuTitles; 
private TypedArray navMenuIcons; 

private ArrayList<NavDrawerItem> navDrawerItems; 
private NavDrawerListAdapter adapter; 

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

    mTitle = mDrawerTitle = getTitle(); 

    // load slide menu items 
    navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items); 

    // nav drawer icons from resources 
    navMenuIcons = getResources() 
      .obtainTypedArray(R.array.nav_drawer_icons); 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerList = (ListView) findViewById(R.id.list_slidermenu); 

    navDrawerItems = new ArrayList<NavDrawerItem>(); 

    // adding nav drawer items to array 
    // Home 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1), true, "4")); 
    // Find People 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1), true, "2")); 
    // Photos 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1), true, "4")); 
    // Communities, Will add a counter here 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1), true, "6")); 
    // Pages 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1), true, "8")); 
    // What's hot, We will add a counter here 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), true, "4")); 


    // Recycle the typed array 
    navMenuIcons.recycle(); 

    mDrawerList.setOnItemClickListener(new SlideMenuClickListener()); 

    // setting the nav drawer list adapter 
    adapter = new NavDrawerListAdapter(getApplicationContext(), 
      navDrawerItems); 
    mDrawerList.setAdapter(adapter); 

    // enabling action bar app icon and behaving it as toggle button 
    getActionBar().setDisplayHomeAsUpEnabled(true); 
    //getActionBar().setHomeButtonEnabled(true); 

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
      R.drawable.ic_drawer, //nav menu toggle icon 
      R.string.app_name, // nav drawer open - description for accessibility 
      R.string.app_name // nav drawer close - description for accessibility 
      ) { 
     public void onDrawerClosed(View view) { 
      getActionBar().setTitle(mTitle); 
      // calling onPrepareOptionsMenu() to show action bar icons 
      invalidateOptionsMenu(); 
     } 

     public void onDrawerOpened(View drawerView) { 
      getActionBar().setTitle(mDrawerTitle); 
      // calling onPrepareOptionsMenu() to hide action bar icons 
      invalidateOptionsMenu(); 
     } 
    }; 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 

    if (savedInstanceState == null) { 
     // on first time display view for first nav item 
     displayView(0); 
    } 
} 

/** 
* Slide menu item click listener 
* */ 
private class SlideMenuClickListener implements 
ListView.OnItemClickListener { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
      long id) { 
     // display view for selected nav drawer item 
     displayView(position); 
    } 
} 

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

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // toggle nav drawer on selecting action bar app icon/title 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    // Handle action bar actions click 
    switch (item.getItemId()) { 
    case R.id.action_settings: 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

/* * 
* Called when invalidateOptionsMenu() is triggered 
*/ 
@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    // if nav drawer is opened, hide the action items 
    boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); 
    menu.findItem(R.id.action_settings).setVisible(!drawerOpen); 
    return super.onPrepareOptionsMenu(menu); 
} 

/** 
* Diplaying fragment view for selected nav drawer list item 
* */ 
private void displayView(int position) { 
    // update the main content by replacing fragments 
    ListFragment fragment = null; 
    switch (position) { 
    case 0: 
     fragment = new FragmentOne(); 
     break; 
    case 1: 
     fragment = new FragmentTwo(); 
     break; 
    case 2: 
     fragment = new FragmentThree(); 
     break; 
    case 3: 
     fragment = new FragmentFour(); 
     break; 
    case 4: 
     fragment = new FragmentFive(); 
     break; 
    case 5: 
     fragment = new FragmentSix(); 
     break; 

    default: 
     break; 
    } 

    if (fragment != null) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     fragmentManager.beginTransaction() 
     .replace(R.id.frame_container, fragment).commit(); 

     // update selected item and title, then close the drawer 
     mDrawerList.setItemChecked(position, true); 
     mDrawerList.setSelection(position); 
     setTitle(navMenuTitles[position]); 
     mDrawerLayout.closeDrawer(mDrawerList); 
    } else { 
     // error in creating fragment 
     Log.e("MainActivity", "Error in creating fragment"); 
    } 
} 

@Override 
public void setTitle(CharSequence title) { 
    mTitle = title; 
    getActionBar().setTitle(mTitle); 
} 

/** 
* When using the ActionBarDrawerToggle, you must call it during 
* onPostCreate() and onConfigurationChanged()... 
*/ 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    // Sync the toggle state after onRestoreInstanceState has occurred. 
    mDrawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    // Pass any configuration change to the drawer toggls 
    mDrawerToggle.onConfigurationChanged(newConfig); 
} 

}

在感謝提前

+0

你可以發佈代碼切換片段嗎? – 2014-10-16 18:18:49

+0

已更新我的主活動 – 2014-10-16 18:30:20

+0

您可以將片段的狀態存儲在'onSaveInstanceState'中。請參閱此問題:http://stackoverflow.com/a/22505654/2868352 – 2014-10-16 18:41:18

回答

0

當您從Fragment2返回到Fragment1時,您正在創建一個Fragm的新實例ENT1。所以當然你的ListView將是空的(直到用戶通過你提供的按鈕添加項目)。

也許你需要修改displayView(int position)所以它不會每次創建一個實例,通過空檢查和全局變量可能?

0

as @lenix當你回到fragment1時提到displayView確實會創建一個新的片段,因爲你對FragmentManager說我已經創建了新的並替換它.. 在這種情況下,你應該檢查isFragment已經添加了嗎?沒有再加入否則隱藏和顯示片段..

FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    if(fragment1.isAdded){ 
     transaction.show(fragment1) 
    }else{ 
     transaction.add(fragment1) 
    } 

不要忘記,當你完成..其公正的方式,看你如何做..這個片段行不通的承諾..

+0

我沒有看到布爾值的需要,他可以簡單地爲null檢查。 – prettyvoid 2014-10-16 20:17:54

0

每當你加載你的片段時,你的ArrayList將從空開始。您可以將當前列表項目保存到共享首選項,並在每次加載片段時獲取列表,或在您的活動中實施set/get回調。