2014-11-26 12 views
8

Sono un novizio a Fragments e adattatori personalizzati ListView. Qualcuno può darmi una mano per favore?NullPointerException: tentativo di richiamare il metodo virtuale 'int java.util.ArrayList.size()' su un riferimento oggetto nullo

ho la mia Fragment dove ho il mio ListView

public class RecordingListFragment extends Fragment implements OnItemClickListener { 

    ListView mListView; 
    TextView emptyView; 
    Button options, delete,edit; 
    ArrayList<String> recordings = null; 
    RecordingsListAdapter mAdapter; 

    public RecordingListFragment() { 
    } 

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

     options = (Button) rootView.findViewById(R.id.options); 
     edit = (Button) rootView.findViewById(R.id.edit); 
     delete = (Button) rootView.findViewById(R.id.delete); 
     mListView = (ListView) rootView.findViewById(R.id.list); 
     emptyView = (TextView) rootView.findViewById(R.id.empty); 


     mAdapter = new RecordingsListAdapter(this, recordings); 
     mListView.setAdapter(mAdapter); 
     mListView.setEmptyView(emptyView); 
     mListView.setOnItemClickListener(this); 

     return rootView; 
    } 
} 

e il mio xml per esso

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:android1="http://schemas.android.com/apk/res/android" 
    android:id="@+id/recording_list_fragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#ffffff" 
    android:orientation="vertical"> 

    <RelativeLayout 
     android:layout_height="50dp" 
     android:layout_width="match_parent" 
     android:orientation="horizontal" 
     android:background="@drawable/title" > 

     <TextView 
      android1:id="@+id/title" 
      android1:layout_width="wrap_content" 
      android1:layout_height="50dp" 
      android1:layout_alignParentTop="true" 
      android1:layout_centerHorizontal="true" 
      android1:layout_marginStart="80dp" 
      android1:gravity="center" 
      android1:text="@string/app_name" 
      android1:textAlignment="center" 
      android1:textColor="#000000" 
      android1:textStyle="bold" /> 

    </RelativeLayout> 

    <FrameLayout 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent"> 

     <ListView 
      android:id="@+id/list" 
      android:animateLayoutChanges="true" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"/> 
     <!-- android:divider="@null"--> 

     <TextView 
      android:id="@+id/empty" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:gravity="center" 
      android:text="@string/empty_list_text" 
      android:paddingLeft="30dp" 
      android:paddingRight="30dp" 
      android:paddingTop="180dp" /> 

    </FrameLayout> 
</LinearLayout> 

e ho ottenuto la mia voce di elenco personalizzato

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
    android:orientation="horizontal" > 

    <CheckedTextView 
     android:id="@+id/textView" 
     android:layout_width="fill_parent" 
     android:layout_height="?android:attr/listPreferredItemHeight" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:gravity="center_vertical" 
     android:checkMark="?android:attr/listChoiceIndicatorSingle" 
     android:paddingLeft="6dip" 
     android:paddingRight="6dip" 
     android:textColor="#000000" 
     /> 

</LinearLayout> 

e infine, il mio Adapter

public class RecordingsListAdapter extends BaseAdapter { 
    Context ctx; 
    LayoutInflater lInflater; 
    ArrayList<String> recordings; 

    RecordingsListAdapter(Context context, ArrayList<String> products) { 
     ctx = context; 
     recordings = products; 
     lInflater = (LayoutInflater) ctx 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public RecordingsListAdapter(RecordingListFragment recordingListFragment, 
    ArrayList<String> recordings) { 
     // TODO Auto-generated constructor stub 
    } 


    @Override 
    public int getCount() { 
     return recordings.size(); 
    } 


    @Override 
    public Object getItem(int position) { 
     return recordings.get(position); 
    } 


    @Override 
    public long getItemId(int position) { 
     return position; 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View view = convertView; 
     if (view == null) { 
      view = lInflater.inflate(R.layout.custom_list_item, parent, false); 
     } 

     return view; 
    } 
} 

e quando ho eseguito questo, ho questa puntatore nullo

11-26 11:00:45.352: E/AndroidRuntime(10191): java.lang.RuntimeException: Unable to start activity ComponentInfo{d/recordings.RecordingsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference 
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.ActivityThread.access$800(ActivityThread.java:144) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.os.Handler.dispatchMessage(Handler.java:102) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.os.Looper.loop(Looper.java:135) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.ActivityThread.main(ActivityThread.java:5221) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at java.lang.reflect.Method.invoke(Native Method) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at java.lang.reflect.Method.invoke(Method.java:372) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
11-26 11:00:45.352: E/AndroidRuntime(10191): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference 
11-26 11:00:45.352: E/AndroidRuntime(10191): at recordings.RecordingsListAdapter.getCount(RecordingsListAdapter.java:36) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.widget.ListView.setAdapter(ListView.java:487) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at recordings.RecordingListFragment.onCreateView(RecordingListFragment.java:47) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.Fragment.performCreateView(Fragment.java:2053) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.BackStackRecord.run(BackStackRecord.java:833) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.Activity.performStart(Activity.java:5948) 
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261) 
11-26 11:00:45.352: E/AndroidRuntime(10191): ... 10 more 

Grazie in anticipo !!!

+0

possibile duplicato di [Che cosa è un'eccezione di puntatore nullo e come posso risolverlo?] (Http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how -do-i-fix-it) – Selvin

+0

ArrayList registrazioni = null; dovresti inizializzarlo – Suvitruf

risposta

16

Si dovrebbe inizializzare vostro registrazioni. Stai passando ad adattatore null

ArrayList<String> recordings = null; //You are passing this null 
6

Change

mAdapter = new RecordingsListAdapter(this, recordings); 

a

mAdapter = new RecordingsListAdapter(getActivity(), recordings); 

e anche fare in modo che recordings!=null a mAdapter = new RecordingsListAdapter(this, recordings);

+1

non ha errori di compilazione, quindi questo non è un problema (ha in realtà un codice diverso?) – Selvin

+0

@Selvin Ok guarda i miei aggiornamenti ... –

+0

Ho aggiunto il tuo cambiamento + Ho popolato le registrazioni con alcuni dati statici e ottengo questo errore '11-26 11: 21: 47.125: E/AndroidRuntime (11596): java.lang.RuntimeException: impossibile avviare l'attività ComponentInfo {xxxxx/recordings.RecordingsActivity}: java.lang.NullPointerException: Tentativo per richiamare il metodo virtuale 'boolean java.util.ArrayList.add (java.lang.Object)' su un riferimento oggetto nullo –

6

Questo problema è dovuto alla variabile ArrayList non istanziata. È necessario dichiarare variabile "registrazioni" come segue, che dovrebbe risolvere il problema;

chiama il costruttore predefinito e assegna una stringa vuota alla variabile di registrazione in modo che non sia più nulla.