2016-08-01 7 views
1

Ich erstelle eine Methode in der Haupttätigkeit, die ein ArrayList-Bundle an meine Fragment-Klasse sendet, aber wenn ich versuche, die erwarteten Werte im Fragment zu erhalten, ist ArrayList in meinem Fragment erklärt null. Kann mir jemand helfen, meinen Code einzusehen?Arraylist übergeben im Fragment ist leer

MainActivity.java: sendBundleData() ist das Verfahren in der MainActivity an das Fragment Arraylist Bündel zu senden

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

Mein Fragment Klasse: Im onCreate Methode des Fragments ich versuche, das Bündel abrufen

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

Können Sie einige Debug tun zu finden, wo Das Problem tritt auf? – 4castle

+0

Ich debugge bereits den Code und es scheint mir null. aber dank @Parth Srivastav und Ihnen, Sir für die Sorgen in meinem Problem. Es ist jetzt gelöst. – PhilipJ

Antwort

2

Es ist, weil Sie Argumente zu einem anderen Fragment inst setzen ance in sendBundleData() und eine separate Instanz ersetzt

das Fragment als Argument übergibt die Methode

public void sendBundleData(Fragment fragment) { 


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

} 

und Switch Fall würde aussehen wie

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

Danke für die Hilfe, Sir. Wird besorgt. – PhilipJ

Verwandte Themen