2013-05-15 2 views
0

저는이 책을 따라하려고하는데이 튜토리얼에서 뭔가를 놓쳤습니다. 그러나 나는 어딘가에 내 길을 잃어 버렸고 왜 널 포인터 예외로 인해이 충돌이 발생하는지 알아 내려고하고있다. 내가 여기에서 놓친 것을 오직 하나만 볼 수 있습니까?Listview에 null 커서가 있습니다.

public class HistoryFragment extends Fragment { 

    DbHelper dbHelper; 
    SQLiteDatabase db; 
    Cursor cursor; 
    ListView listTimeline; 
    SimpleCursorAdapter adapter; 
    static final String[] FROM = {DbHelper.KEY_CHARTING_DATE, DbHelper.KEY_NAME, DbHelper.KEY_CHARTING_NOTES}; 
    static final int[] TO = {R.id.textDate, R.id.textUser, R.id.textText}; 



    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    }  

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

     View view = inflater.inflate(R.layout.fragment_history, container, false); 

     listTimeline = (ListView) getView().findViewById(R.id.listTimeline); 

     //connect to database 
     dbHelper = new DbHelper(getActivity()); 
     db = dbHelper.getReadableDatabase(); 

     return view; 

    } 

    @Override 
    public void onDestroy(){ 
     super.onDestroy(); 

     //close datbase 
     db.close(); 
    } 

    @Override 
    public void onResume(){ 
     super.onResume(); 

     //Get the data from the database 
     cursor = db.query(DbHelper.DATABASE_TABLE, null, null, null, null, null, DbHelper.KEY_CHARTING_DATE + " DESC"); 
     getActivity().startManagingCursor(cursor); 

     //Sup up the adapter 
     adapter.setViewBinder(VIEW_BINDER); 
     listTimeline.setAdapter(adapter); 
    } 

    static final ViewBinder VIEW_BINDER = new ViewBinder() { 
     public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
      if (view.getId() != R.id.textDate) 
       return false; 

      //update the created at text 
      long timestamp = cursor.getLong(columnIndex); 
      CharSequence relTime = DateUtils.getRelativeTimeSpanString(view.getContext(), timestamp); 
      ((TextView) view).setText(relTime); 

      return true; 
     } 
    }; 
} 

는 로그 캣 :

 05-15 20:37:49.412: E/AndroidRuntime(945): java.lang.NullPointerException 
     05-15 20:37:49.412: E/AndroidRuntime(945): at com.projectcaruso.naturalfamilyplaning.HistoryFragment.onCreateView(HistoryFragment.java:41) 
     05-15 20:37:49.412: E/AndroidRuntime(945): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460) 
     05-15 20:37:49.412: E/AndroidRuntime(945): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911) 
     05-15 20:37:49.412: E/AndroidRuntime(945): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
     05-15 20:37:49.412: E/AndroidRuntime(945): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
     05-15 20:37:49.412: E/AndroidRuntime(945): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 
     05-15 20:37:49.412: E/AndroidRuntime(945): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429) 
     05-15 20:37:49.412: E/AndroidRuntime(945): at android.os.Handler.handleCallback(Handler.java:725) 
     05-15 20:37:49.412: E/AndroidRuntime(945): at android.os.Handler.dispatchMessage(Handler.java:92) 
     05-15 20:37:49.412: E/AndroidRuntime(945): at android.os.Looper.loop(Looper.java:137) 
     05-15 20:37:49.412: E/AndroidRuntime(945): at android.app.ActivityThread.main(ActivityThread.java:5041) 
     05-15 20:37:49.412: E/AndroidRuntime(945): at java.lang.reflect.Method.invokeNative(Native Method) 
     05-15 20:37:49.412: E/AndroidRuntime(945): at java.lang.reflect.Method.invoke(Method.java:511) 
     05-15 20:37:49.412: E/AndroidRuntime(945): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
     05-15 20:37:49.412: E/AndroidRuntime(945): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
     05-15 20:37:49.412: E/AndroidRuntime(945): at dalvik.system.NativeStart.main(Native Method) 
+0

음 :이와

View view = inflater.inflate(R.layout.fragment_history, container, false); listTimeline = (ListView) getView().findViewById(R.id.listTimeline); 

을 그? –

+0

listTimeline = (ListView) getView(). findViewById (R.id.listTimeline); – jcaruso

+0

ListFragment를 사용하지 않는 이유는 무엇입니까? http://developer.android.com/reference/android/app/ListFragment.html –

답변

1

getView 방법은 onCreateView에 의해 반환되는 뷰를 돌려줍니다. onCreateView이 완료되기 전에 전화를 걸므로 getView()null을 반환합니다. 여기 문서를 참조하십시오 :
https://developer.android.com/reference/android/app/Fragment.html#getView%28%29

이 라인을 교체하십시오 : 당신은 예외가 라인 (41)에 발생하는 그래서 어느 선 것을 볼 수 있습니다

View view = inflater.inflate(R.layout.fragment_history, container, false); 
listTimeline = (ListView) view.findViewById(R.id.listTimeline); 
+0

굉장! 그게 저를 지나쳐서 오류가 발생했습니다 \t \t adapter.setViewBinder (VIEW_BINDER); – jcaruso

+0

오류가 무엇인지 알아야하지만 어댑터가 null이므로 NPE를 얻고있는 것 같습니다. https://developer.android.com/training/basics/activity-lifecycle/index.html에서 Android 활동 라이프 사이클에 대해 읽어 보시기 바랍니다. 일시 중지 및 다시 시작하는 것이 좋습니다. 이것은 상당히 다른 문제입니다. 링크가 도움이되지 않는다면 더 자세한 정보로 새로운 질문을 여는 것이 좋습니다. –

+0

고마워요. 내가 그것을 만들 때 순간에 링크 할게요. – jcaruso