0

我已經在各處搜索了,但還沒有解決我的問題。Android ArrayAdapter在ViewPager中使用時會導致NullPointerException

我在Activity中使用ViewPager。 ViewPager包含3個片段:一個是普通片段,第二個片段包含自定義ListView,第三個片段是MapFragment(SupportMapFragment)。

我只使用支持片段。

問題是在活動嘗試填充設置適配器和地圖上的標記的片段後,將調用ViewPager適配器(FragmentPagerAdapter)的getItem()方法。

所以,我triyng初始化ViewPager之前初始化片段,使用用於片段一個單模式:

在活動的onCreate():

setContentView(R.layout.act_discover_small); 
profiloFragment = new ProfiloFragment(); 
mapFragment = new MappaMonumentiFragment(); 
elencoFragment = new ElencoMonumentiFragment(); 
initViewPager(); 

的initViewPager()方法是:

private void initViewPager() { 
    mPagerAdapter = new PagerAdapter(getSupportFragmentManager()); 
    mViewPager = (SmartViewPager) findViewById(R.id.pager); 
    mViewPager.setAdapter(mPagerAdapter); 
    mViewPager.setOffscreenPageLimit(3); 
    mViewPager.setOnPageChangeListener(new OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 
      if (!beginSwipe) 
       elencoFragment.List.finishRefresh(); 
      beginSwipe = true; 
     } 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 

     } 

     @Override 
     public void onPageSelected(int arg0) { 
      beginSwipe = false; 
      lockDrawer(arg0); 
      if (arg0 == 0) { 
       swipe_left_button.setText("show map"); 
      } else { 
       swipe_left_button.setText("show list"); 
      } 
     } 
    }); 
} 

這是ViewPager適配器

class PagerAdapter extends FragmentPagerAdapter { 
    public PagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 

    @Override 
    public Fragment getItem(int i) { 
     Log.i(TAG, "getItem viewpager n." + i); 
     switch (i) { 
     case 0: 
      if (profiloFragment == null) 
       profiloFragment = new ProfiloFragment(); 
      return profiloFragment; 
     case 1: 
      if (elencoFragment == null) 
       elencoFragment = new ElencoMonumentiFragment(); 
      return elencoFragment; 
     case 2: 
      if (mapFragment == null) 
       mapFragment = new MappaMonumentiFragment(); 
      return mapFragment; 
     } 
     return null; 
    } 
} 

我得到triyng以填充與所述元件的第二個片段的一個ArrayAdapter在該方法中,當(在onPostExecute(執行)的的AsyncTask的)一個NullPointerException:

public void populateElencoMonumenti(List<SmartPlace> placesList) { 
    if (placesList != null) { 
     places = (ArrayList<SmartPlace>) placesList; 
     //before: adapter.clear(); //NullPointerException at this line 
        //after: 
        if (adapter == null) { 
      adapter = new ElencoMonumentiAdapter(ctx, act, app); 
     } 


     adapter.addAll(places); 
     List.setAdapter(adapter); 

    } else { 
     adapter.clear(); 
     List.setAdapter(adapter); 
    } 
} 

如果我登錄(適配器== null)在調用adapter.clear()之前它返回true,所以它是空的。

如果我嘗試檢查它是否是空並重新初始化它,我得到了NPE在適配器的構造:

public ElencoMonumentiAdapter(Context ctx, Discover homAct, SmartApplication app) { 
    // super(ctx, R.layout.list_row_monument); 
    super(ctx, R.layout.list_row_monument, new ArrayList<SmartPlace>()); //NPE here 
    Log.e(TAG, "null ctx? " + (ctx == null)); 
    this.app = app; 
    this.ctx = ctx; 
} 

堆棧跟蹤是:

12-18 11:13:07.285: E/AndroidRuntime(20865): FATAL EXCEPTION: main 
12-18 11:13:07.285: E/AndroidRuntime(20865): Process: com.Thinple.MiWalks.ui, PID: 20865 
12-18 11:13:07.285: E/AndroidRuntime(20865): java.lang.NullPointerException 
12-18 11:13:07.285: E/AndroidRuntime(20865): at android.widget.ArrayAdapter.init(ArrayAdapter.java:310) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:153) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at com.Thinple.MiWalks.ui.adapters.ElencoMonumentiAdapter.<init>(ElencoMonumentiAdapter.java:41) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at com.Thinple.MiWalks.ui.fragments.ElencoMonumentiFragment.populateElencoMonumenti(ElencoMonumentiFragment.java:129) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at com.Thinple.MiWalks.ui.Discover.notifyFragments(Discover.java:328) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at com.Thinple.MiWalks.ui.Discover.populatePlaces(Discover.java:509) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at com.Thinple.MiWalks.threading.tasks.GetPlacesFromDBtask.onPostExecute(GetPlacesFromDBtask.java:53) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at com.Thinple.MiWalks.threading.tasks.GetPlacesFromDBtask.onPostExecute(GetPlacesFromDBtask.java:1) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at android.os.AsyncTask.finish(AsyncTask.java:632) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at android.os.Handler.dispatchMessage(Handler.java:102) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at android.os.Looper.loop(Looper.java:136) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at android.app.ActivityThread.main(ActivityThread.java:5017) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at java.lang.reflect.Method.invokeNative(Native Method) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at java.lang.reflect.Method.invoke(Method.java:515) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
12-18 11:13:07.285: E/AndroidRuntime(20865): at dalvik.system.NativeStart.main(Native Method) 

我真的不覺得一個辦法。

在此先感謝您的回覆。

+0

適配器爲null,則它聲明和初始化在哪裏? – Raghunandan

+0

在片段onStart()我這樣做: \t \t adapter = new ElencoMonumentiAdapter(ctx,act,app); \t \t List.setAdapter(adapter); (TAG,「adapter null?」+(adapter == null)); 和日誌打印false ..所以它不是空! 編輯:我試圖在onAttach()或onCreateView()中移動該代碼alson,但它沒有奏效。 –

+0

它是空的,如果不是你不會NPE在線。順便問一下,ctx是什麼 – Raghunandan

回答

1

變化

super(ctx, R.layout.list_row_monument, new ArrayList<SmartPlace>()); 

new ArrayList<SmartPlace>()是新arraylsit但其空不與任何數據填充

super(ctx, R.layout.list_row_monument, list); 

名單可能是ArrayList<SmartPlace>()被傳遞到適配器類

的構造

看看公共構造

http://developer.android.com/reference/android/widget/ArrayAdapter.html

+0

這條線是正確的! NPE不再被拋出!謝謝!我會接受你的答案,但問題還沒有解決,因爲另一個片段,mapfragment現在拋出NPE –

+0

@LorenzoBarbagli這是不同的問題。用相關堆棧跟蹤和相關代碼問一個新問題。我相信也可以解決 – Raghunandan

+1

好吧,沒有必要,我解決了它,只需控制映射是否爲空,並通過從片段中調用getMap()重新初始化它。 非常感謝您的幫助。可否告訴我爲什麼超級(ctx,R.layout.list_row_monument,list);正在工作,其他沒有?謝謝! –

相關問題