2013-07-26 7 views
0

J'essaie d'utiliser un ListView et un Fragment.Fragment et Listview

Mon code:

public static class ownFragment extends Fragment 
{ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     MyListFragment test = new MyListFragment(); 
     test.makelist(); 
     return inflater.inflate(R.layout.whitelist_content, container, false); 
    } 

    public class MyListFragment extends ListFragment { 

     private AdapterView.OnItemClickListener listener; 


     public void makelist() 
     { 
      String[] values = new String[] { "Android", "iPhone", "WindowsMobile", 
        "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", 
        "Linux", "OS/2" }; 
      ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), 
        android.R.layout.simple_list_item_1, values); 
      setListAdapter(adapter); 
     } 

     public void setOnItemClickListener(AdapterView.OnItemClickListener l) { 
      this.listener = l; 
     } 

     @Override 
     public void onListItemClick(ListView l, View v, int position, long id) { 
      if(listener != null) { 
       listener.onItemClick(l, v, position, id); 
      } 
     } 

} 

} 


  public void clickme(View view){ 
      FragmentManager fragmentManager = getFragmentManager(); 
      fragmentManager.beginTransaction() 
       .replace(R.id.content_frame, new ownFragment()) 
       .commit(); 
      } 

mais si je reçois un NullPointerException

enter code her07-26 22:57:46.709 19489-19489/de.anocom.ecp E/AndroidRuntime: FATAL EXCEPTION: main 
    java.lang.NullPointerException 
    at android.widget.ArrayAdapter.init(ArrayAdapter.java:310) 
    at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:128) 
    at de.anocom.ecp.MainActivity$Whitelist$MyListFragment.makelist(MainActivity.java:296) 
    at de.anocom.ecp.MainActivity$ownFragment.onCreateView(MainActivity.java:282) 
    at android.app.Fragment.performCreateView(Fragment.java:1695) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057) 
    at android.app.BackStackRecord.run(BackStackRecord.java:682) 
    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435) 
    at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441) 
    at android.os.Handler.handleCallback(Handler.java:730) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:5103) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:525) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
    at dalvik.system.NativeStart.main(Native Method)e 
+0

Avez-vous effectué le débogage? Y a-t-il un élément dans le constructeur de l'adaptateur qui est NULL? Evidemment ce ne sont pas des valeurs, et je doute fortement de son android.R.layout.simple_list_item_1, donc je devine que getActivity() est NULL –

+0

Oui c'est nul. Maintenant, j'ai sur Attachez-le d'abord mais c'est toujours nul? – ternes3

+0

Avez-vous essayé la solution ci-dessous publiée par Karakuri? –

Répondre

1

D'abord, vous ne devriez pas avoir la MyListFragment classe interne. Faire la classe externe étendre ListFragment et y mettre tout votre code de liste, et se débarrasser de la classe interne. En second lieu, getActivity() renverra null si le fragment n'est pas encore attaché à une activité (d'où l'exception NullPointerException). La plupart du temps, j'attends le rappel de onActivityCreated() pour faire quoi que ce soit avec l'activité, comme l'initialisation de l'adaptateur.

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(SavedInstanceState) 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, values); 
    setListAdapter(adapter); 
} 
Questions connexes