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

相关问题