2

從我開始開發此應用程序開始,這是一個我一直有3個月的問題。我在這個網站上讀過數百篇文章,其他人也閱讀過,我還沒有找到解決方案。 我相信這個問題必須採用我擁有應用程序的結構的方式。Activity中的片段在setAdapter中爲ListView獲取上下文null

我正在開發一個應用程序,顯示幾個部分,每個部分是一個片段,主要活動使用ViewPager一次顯示一個片段(如fb應用程序或Twitter應用程序)。每個部分都會顯示不同信息的列表視圖:新聞,視頻,分類等等。一旦某個部分顯示,讓我們說新聞部分,它顯示了一個列表視圖與文章/新聞。問題是當我嘗試顯示列表視圖,因爲在適配器我用來顯示列表視圖給我NullPointerException,在行setAdapter

我跟蹤了一條給我例外的線,實際上是context聲明。即使上下文在我的所有片段中都爲null(我不知道爲什麼),但我可以顯示列表視圖,但在其他一些應用程序中,應用程序崩潰並給出了NPE。我通過行Context context=getActivity()獲得上下文,但是當我測試它時,它給了我空值。

這是我已經成功地顯示在列表視圖

public class HomeActivity extends Fragment{ 
    static ListView newsList; 
    static Item item=null; 
    Context context=getActivity(); 
    ItemAdapter itemAdapter; 
    List<Item> news=new ArrayList<Item>(); 
    static int i=0; 
    static Activity activity; 
    static String HOME_FRAGMENT="NEWS"; 
    public static final int TIME_ENTRY_REQUEST_CODE=1; 
    FragmentManager fm; 


public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){ 
    super.onCreateView(inflater, container, savedInstanceState); 
    View view=inflater.inflate(R.layout.home_activity, container,false); 
    newsList=(ListView)view.findViewById(R.id.newslist); 
    setRetainInstance(true); 
    return view; 
} 

public void onAttach(Activity activity){ 
    super.onAttach(activity); 
    HomeActivity.activity=activity; 
} 

public void onSaveInstanceState(Bundle outState){ 
    super.onSaveInstanceState(outState); 
} 

public void displayNews(final List<Item> news){ 
    try {   
     if(news==null || news.size()==0){ 
       //Retrieve again the data list 
     } 
     Log.d("HomeActivity","total news: "+news.size()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    if(context==null){ 
     Log.d("HomeActivity","context null!"); 
    } 
    itemAdapter=new ItemAdapter(context,(ArrayList<Item>) news); 
    newsList.setAdapter(itemAdapter); 
} 

}

更新片段之一:這是另外一個片段,我得到了NPE,

public class VideosActivity extends Fragment{ 

ListView listvideo; 
ItemAdapter itemAdapter; 
Context context; 
Activity activity; 
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){ 
     super.onCreateView(inflater, container, savedInstanceState); 
     View view=inflater.inflate(R.layout.videos_activity, container,false); 
     listvideo=(ListView)view.findViewById(R.id.videoslist); 
     Log.d("videos activity","onCreateView ready!!"); 
       context=getActivity(); 
     setRetainInstance(true); 
     return view; 
    } 


public void onAttach(Activity activity){ 
    super.onAttach(activity); 
    this.activity=activity; 
} 

public void displayVideos(final List<Item> videos){ 
    try {   
     if(videos==null || videos.size()==0){ 
       //Retrieve again the data list 

     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    for(int i=0;i<videos.size();i++){ 

    } 
    itemAdapter=new ItemAdapter(activity,(ArrayList<Item>) videos);//I also used context in this line, but I still get the NPE 
    listvideo.setAdapter(itemAdapter); //Here's the line that gives me the NPE 
} 

}

我解析XML中的所有信息,並且通過的AsyncTask
這是我的適配器

public class ItemAdapter extends BaseAdapter implements OnItemClickListener{ 
    Item item=new Item(); 
    private ArrayList<Item> news=new ArrayList<Item>(); 
    private static final int NO_PICTURE_VIEW=0; 
    private static final int PICTURE_VIEW=1; 

    public ItemAdapter(Context context,ArrayList<Item> items) { 
    super(); 
    news.addAll(items); 
    } 
    public int getCount() { 
    // TODO Auto-generated method stub 
    return news.size(); 
} 

    public Item getItem(int index) { 
    // TODO Auto-generated method stub 
    return getItem(index); 
} 

    public long getItemId(int index) { 
    // TODO Auto-generated method stub 
    return index; 
} 

    public int getViewTypeCount() { 
     return 2; 
} 

    public int getItemViewType(int position) { 
    Item article=news.get(position);  
     if(article.getImage()!=null)  
      return PICTURE_VIEW; 
     else 
       return NO_PICTURE_VIEW; 
} 
@Override 
    public View getView(int index, View view, ViewGroup parent) { 
    item=news.get(index); 
    int type=getItemViewType(index); 
    if(view==null){ 
      LayoutInflater inflater=LayoutInflater.from(parent.getContext()); 
     if(type==NO_PICTURE_VIEW){ 
     view=inflater.inflate(R.layout.item_no_picture_list,parent,false); 
       TextView titleView=(TextView)view.findViewById(R.id.titleNoPicture); 
     titleView.setText(item.getTitle()); 
     } 
     else{ 
     view=inflater.inflate(R.layout.item_picture_list,parent,false); 
     TextView titleView=(TextView)view.findViewById(R.id.titleArticle); 
     ImageView image=(ImageView)view.findViewById(R.id.imageItem); 
     titleView.setText(item.getTitle()); 
     image.setImageBitmap(item.getImage()); 
    } 
} 

return view; 
} 
} 

這是主要的活動

public class MainActivity extends FragmentActivity{ 
    private String tabs[]={"News","Sports","Valley Life","Videos","Classifieds","Directory","Weather"}; 
ViewPager viewPager=null; 
FragmentManager fragmentManager=getSupportFragmentManager(); 
android.support.v4.app.FragmentTransaction ft=fragmentManager.beginTransaction(); 
    AdapterView adapterView; 
static ParseManager parser=new ParseManager(); 
static List<Item> news=new ArrayList<Item>(); 
ArrayList<Item> sports=new ArrayList<Item>(); 
ArrayList<Item> valleyLife=new ArrayList<Item>(); 
public static final int TIME_ENTRY_REQUEST_CODE=1; 
HomeActivity home; 
JSONManager jmanager=new JSONManager(); 
WeatherManager weather=new WeatherManager(); 

    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    viewPager=(ViewPager)findViewById(R.id.pager); 
    viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){ 
       public void onPageSelected(int position)   
       getActionBar().setSelectedNavigationItem(position); 
      } 
    }); 
    viewPager.setAdapter(new AdapterView(fragmentManager)); 
    viewPager.setOffscreenPageLimit(tabs.length); 
    adapterView=new AdapterView(getSupportFragmentManager()); 
    /*initialization of the action bar: color, icon & title.*/ 
    final android.app.ActionBar actionbar=getActionBar(); 
    ColorDrawable color=new ColorDrawable(Color.parseColor("#cd853f")); 
    actionbar.setBackgroundDrawable(color); 
    actionbar.setTitle("Title"); 
    ActionBar.TabListener tabListener=new ActionBar.TabListener() { 
     public void onTabUnselected(Tab tab, FragmentTransaction ft) { 

     } 


     @Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      viewPager.setCurrentItem(tab.getPosition()); 
      ft=getFragmentManager().beginTransaction(); 
      //ft.replace(layouts[tab.getPosition()], (adapterView.getItem(tab.getPosition())); 
      ft.commit(); 

     } 

     @Override 
     public void onTabReselected(Tab tab, FragmentTransaction ft) { 

     } 
    }; 
    /*Displaying Tabs for the app */ 
    for(int i=0;i<tabs.length;i++) 
     actionbar.addTab(actionbar.newTab().setText(tabs[i]).setTabListener(tabListener)); 
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
      viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
       @Override 
       public void onPageSelected(int position) { 
       actionbar.setSelectedNavigationItem(position); 
      } 

       @Override 
       public void onPageScrolled(int arg0, float arg1, int arg2) { 
      } 
       @Override 
       public void onPageScrollStateChanged(int arg0) { 
      } 
     }); 
     parser.execute(); 
     jmanager.execute(); 
     weather.execute(); 
     getApplicationContext(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

}

這是我的logcat

FATAL EXCEPTION: main 
java.lang.NullPointerException 
at com.example.test23.VideosActivity.displayVideos(VideosActivity.java:54) 
at com.example.test23.ParseManager.onPostExecute(ParseManager.java:52) 
at com.example.test23.ParseManager.onPostExecute(ParseManager.java:1) 
at android.os.AsyncTask.finish(AsyncTask.java:631) 
at android.os.AsyncTask.access$600(AsyncTask.java:177) 
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5031) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 
at dalvik.system.NativeStart.main(Native Method) 

UPDATE:這是video_activity.xml

​​

我只是希望能夠知道什麼是錯我的應用程序,爲什麼我得到的情況下空,所以我可以用接下來會發生什麼入手我應用程序,也許是結構的東西,它的編程方式,我不知道。任何幫助表示讚賞,如果你需要更多的代碼,讓我知道。

+0

發表您的videos_activity.xml –

+0

@Rod_Algonquin剛剛發佈了它! – Rosie

回答

1

確保從該行刪除 「= getActivity()」:

Context context=getActivity(); 

因此它只是讀取:

Context context; 

然後改變這:

public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle  savedInstanceState){ 
    super.onCreateView(inflater, container, savedInstanceState); 
    View view=inflater.inflate(R.layout.home_activity, container,false); 
    newsList=(ListView)view.findViewById(R.id.newslist); 
    setRetainInstance(true); 
    return view; 
} 

這樣:

public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle  savedInstanceState){ 
    super.onCreateView(inflater, container, savedInstanceState); 
    View view=inflater.inflate(R.layout.home_activity, container,false); 
    newsList=(ListView)view.findViewById(R.id.newslist); 
    context = getActivity(); // <--- add this line here 
    setRetainInstance(true); 
    return view; 
} 
+0

我做到了這一點,但我仍然得到NPE,我測試過它,但上下文仍然爲空 – Rosie

+0

您是否更改所有片段以使用上述方法? – JDJ

+0

是的,在所有這些中,我仍然收到NPE – Rosie

0

你只能用getActivity()設置情境後onAttach被稱爲所以做

context = getActivity() 

onCreateView

+0

我試過上面的線,但仍然給我NPE – Rosie

+0

顯示更新的代碼,並在代碼中的位置得到例外 – tyczj

+0

只是更新了代碼並添加了行 – Rosie

相關問題