2016-08-01 44 views
1

我在主活動中創建一個Method,它發送一個ArrayList Bundle到我的Fragment類,但是當我嘗試獲取片段中的期望值時,在我的片段中聲明的ArrayList是null。有人可以幫我檢查我的代碼嗎?Arraylist通過片段爲空

MainActivity.java: sendBundleData()是在MainActivity的方法進行的ArrayList束髮送到片段

public class MainActivity extends AppCompatActivity { 

private ActionBarDrawerToggle toggle; 
private DrawerLayout drawerLayout; 
private ListView lv; 
private String[] arrValues; 
private ArrayAdapter<String> adapter; 
DBHelper helper; 
public ArrayList<Bible> _bibleValues; 

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

    /** Instance of DBHelper */ 
    helper = new DBHelper(MainActivity.this); 

    /** Getting arraylist values from the DBHelper */ 
    try { 
     _bibleValues=helper.queryData(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

    /** Initialize drawer layout */ 
    drawerLayout= (DrawerLayout) findViewById(R.id.drawerLayout_bibledashboard); 

    //Getting the values of the String resources to the array 
    arrValues=getApplicationContext().getResources().getStringArray(R.array.verse_chapter); 

    //Setting the needed parameters in an Array Adapter 
    adapter= new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,arrValues); 
    lv= (ListView) findViewById(R.id.listview_verseTitle); 
    lv.setAdapter(adapter); 

    //Specify the OnItemCLick listener in the Listview 
    lv.setOnItemClickListener(new DrawerItemClickListener()); 

    if (savedInstanceState == null){ 
     selectItem(0); 
    } 

    /** CHeck if we can createDatabase */ 
    try { 
     helper.createDatabase(); 
    }catch (IOException e) { 
     e.printStackTrace(); 
     throw new Error("Unable to Create Database"); 
    } 

    /** CHeck to open the database created */ 
    try { 
     helper.openDatabase(); 
    }catch (SQLException e) { 
     e.printStackTrace(); 
     throw new Error("Unable to open Database"); 
    } 
    Log.d("Database Creation","Success"); 



    /** Display Sample Data Query in DATABASE 
    try { 
     verseList=helper.queryData(); 

     verseAdapter= new VerseAdapter(this,verseList); 

    } catch (SQLException e) { 
     e.printStackTrace(); 
    } */ 

    /** Setting up DrawerToggle */ 
    toggle= new ActionBarDrawerToggle(this,drawerLayout,R.string.drawer_opened,R.string.drawer_closed) { 
     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      invalidateOptionsMenu(); 
     } 

     @Override 
     public void onDrawerClosed(View drawerView) { 
      super.onDrawerClosed(drawerView); 
      invalidateOptionsMenu(); /** ENd of Coding */ 
     } 
    }; //end of toggle '}' 

    drawerLayout.addDrawerListener(toggle); 

    /** Enabling ActionbarDrawer toggle */ 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 

} /** End of OnCreate */ 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    toggle.onConfigurationChanged(newConfig); 
} 

@Override 
protected void onPostCreate(@Nullable Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    toggle.syncState(); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (toggle.onOptionsItemSelected(item)) { 
    } 
    return true; 
} 


/** Method for sending Bundle of arraylist to the Fragments*/ 

public void sendBundleData() { 

    GenesisFragment gFragment= new GenesisFragment(); 
    Bundle args= new Bundle(); 
    args.putParcelableArrayList("verseValues",_bibleValues); /** Make the Object class Parcelable 1st */ 
    gFragment.setArguments(args); 

} 


private class DrawerItemClickListener implements ListView.OnItemClickListener { 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     selectItem(position); 
    } 
} 

private void setActionBarTitles(int position) { 
    String title; 
    if (position==0) { 
     title="Genesis"; 
    }else { 
     title=arrValues[position]; 
    } 

    getSupportActionBar().setTitle(title); 
} 

private void selectItem(int position) { 
    Fragment fragment; 
    switch (position) { 
     case 0: 
      fragment= new GenesisFragment(); 
      sendBundleData(); 
      break; 
     default: 
      fragment=new GenesisFragment(); 
      break; 
    } 

    FragmentTransaction ft= getFragmentManager().beginTransaction(); 
    ft.replace(R.id.bible_screenlayout,fragment); 
    ft.addToBackStack(null); 
    ft.commit(); 
    setActionBarTitles(position); 
    drawerLayout.closeDrawer(lv); 
} 

我的片段類: 在我嘗試片段的onCreate方法檢索束

public class GenesisFragment extends Fragment { 

    ListView lv; 
    ArrayList<Bible> verseList; 
    VerseAdapter verseAdapter; 



    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     Log.d("ON ATTACH","onAttache method!"); 
    } 

    /** @Override */ 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d("ON CREATE","onCreate"); 

     Bundle bundle=getArguments(); 

     verseList= new ArrayList<>(); 
     verseList=bundle.getParcelableArrayList("verseValues"); //retrieving bundles in the MainActivity 



    } 

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

     verseAdapter= new VerseAdapter(getActivity(),verseList); 
     // Inflate the layout for this fragment 
     View v= inflater.inflate(R.layout.fragment_genesis, container, false); 

     return v; 



    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 

     lv=(ListView)getActivity().findViewById(R.id.listview_genesis); 

     lv.setAdapter(verseAdapter); 
     verseAdapter.notifyDataSetChanged(); 


    } 
} 
+2

你可以做一些調試,以找到在哪裏該問題出現了嗎? – 4castle

+0

我已經調試了代碼,它似乎給了我null。但感謝@Parth Srivastav和您先生在我的問題上的擔憂。現在已經解決了。 – PhilipJ

回答

2

這是因爲你設置的參數爲不同的片段研究所ANCE在sendBundleData()和更換單獨的實例

傳遞片段作爲參數傳遞給方法

public void sendBundleData(Fragment fragment) { 


Bundle args= new Bundle(); 
args.putParcelableArrayList("verseValues",_bibleValues); /** Make the Object class Parcelable 1st */ 
fragment.setArguments(args); 

} 

和交換機的情況下看起來像

switch (position) { 
    case 0: 
     fragment= new GenesisFragment(); 
     sendBundleData(fragment); 
     break; 
    default: 
     fragment=new GenesisFragment(); 
     break; 
} 
+0

謝謝您的幫助先生。會做。 – PhilipJ