2014-10-30 25 views
0

我想創建一個樣板文件。我不斷收到一個空引用錯誤,雖然當我嘗試設置我RecyclerView的LayoutManager的:爲什麼我的活動上下文在我的片段中爲空?

Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference

下面是我稱之爲得到錯誤的順序:

Main.class:

public class PagerAdapter extends FragmentPagerAdapter { 
    ... 
    @Override 
    public Fragment getItem(int position){ 
     switch(position){ 
      default: 
       return new WhatsNew(); 
     } 
    } 
} 

WhatsNew.class:

public class WhatsNew extends Base { 

    private LayoutInflater mInflater; 
    private Handler mHandler = new Handler(); 

    private RecyclerView.LayoutManager mLayoutManager; 

    @Override 
    public void init() { 
     mInflater = LayoutInflater.from(mContext); 
     mLayoutManager = new LinearLayoutManager(mContext); 
     mDataView.setLayoutManager(mLayoutManager); //<-- Where the null reference is 
    } 

    @Override 
    public void doWork() { 

     WhatsNewAdapter mAdapter = new WhatsNewAdapter(); 
     mDataView.setAdapter(mAdapter); 
     ... 

    } 

    ... 
} 

Base.class:

public class Base extends Fragment { 

    public View mView; 
    public RecyclerView mDataView; 
    public ProgressBar mProgressBar; 
    public Context mContext; 

    public Base() { } 

    @Override 
    public void onAttach(Activity mActivity) { 
     mContext = mActivity; 
     init(); 
     doWork(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater _i, ViewGroup _vg, Bundle savedInstanceBundle){ 
     mView = _i.inflate(R.layout.f_base, null); 
     mDataView = (RecyclerView) mView.findViewById(R.id.data); 
     mProgressBar = (ProgressBar)mView.findViewById(R.id.loading); 
     return mView; 
    } 

    public void init() { } 

    public void doWork() { } 

} 

我從here讀,我應該重寫onAttach(Activity activity)確保上下文不爲空,但是從錯誤,它仍然似乎是空。任何人都知道爲什麼我會偶然得到這個錯誤,或者對我應該如何設置我的樣板碎片有更好的建議?對不起,如果代碼看起來不好,我想更好地學習使用片段。 :)

+0

嘗試調用'的init()'和'的doWork()'在任一onCreateView()或'onViewCreated()' – EpicPandaForce 2014-10-30 15:20:35

回答

4

您的mDataView尚未初始化。

onAttach()onCreateView()之前被調用。 init()在使用mDataView之前調用mDataViewonCreateView()中初始化。

將需要訪問片段視圖的代碼推遲到onCreateView()或更高版本。

1

onAttach()onCreateView()之前被調用。

因此,mDataView在init()處爲null。

我建議叫init()doWork()onViewCreated()

相關問題