Android 活动中的片段在ListView的setAdapter中为gets context null
事实上,自从我开始开发这个应用程序以来,我已经有三个月的时间遇到这个问题了。我在这个网站上读过数百篇文章,在其他网站上,我读过教程,但还没有找到解决方案我相信这个问题与我使用应用程序结构的方式有关 我正在开发一个显示多个部分的应用程序,每个部分都是一个片段,主要活动使用ViewPager一次显示一个片段(如fb应用程序或twitter应用程序)。每个部分将显示包含不同信息的列表视图:新闻、视频、分类广告等。一旦一个部分显示出来,比如说新闻部分,它就会显示一个包含文章/新闻的列表视图。问题是当我试图显示listview时,因为在我用来显示listview的适配器中,Android 活动中的片段在ListView的setAdapter中为gets context null,android,listview,android-fragments,android-asynctask,fragment,Android,Listview,Android Fragments,Android Asynctask,Fragment,事实上,自从我开始开发这个应用程序以来,我已经有三个月的时间遇到这个问题了。我在这个网站上读过数百篇文章,在其他网站上,我读过教程,但还没有找到解决方案我相信这个问题与我使用应用程序结构的方式有关 我正在开发一个显示多个部分的应用程序,每个部分都是一个片段,主要活动使用ViewPager一次显示一个片段(如fb应用程序或twitter应用程序)。每个部分将显示包含不同信息的列表视图:新闻、视频、分类广告等。一旦一个部分显示出来,比如说新闻部分,它就会显示一个包含文章/新闻的列表视图。问题是当我试
setAdapter
行给了我NullPointerException
我找到了给出异常的那一行,实际上是context
声明。尽管我的所有片段中的上下文都是空的(我不知道为什么),但我能够显示listview,但在其他一些片段中,应用程序崩溃并给出NPE。我通过行context context=getActivity()
获取上下文,但是当我测试它时,它会给我null
这是我成功显示listview的片段之一
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);
}
更新:这是video_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/videoslist"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
我只是想知道我的应用程序出了什么问题,为什么我得到的上下文为空,这样我就可以继续我的应用程序的下一步,也许是结构上的问题,它的编程方式,我不知道。非常感谢您的帮助,如果您需要更多代码,请告诉我。您只能在调用
onAttach
后使用getActivity()
设置上下文
context = getActivity()
在您的onCreateView
中,确保从此行中删除“=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;
}
创建视图时的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
super.onCreateView(充气机、容器、保存状态);
视图=充气机。充气(R.layout.home\u活动,容器,错误);
newsList=(ListView)view.findViewById(R.id.newsList);
context=getActivity();//发布您的活动视频。xml@Rod_Algonquin刚刚发布!显示更新后的代码以及在代码中获得例外的位置我这样做了,但我仍然获得NPE,我测试了它,但上下文仍然为空。您是否更改了所有片段以使用上述方法?是的,在所有片段中,但我仍然收到NPEAre您确定itemAdapte吗r是什么是null而不是listVideo?我可以推荐的最好方法是,在displayVideos()内部,在itemAdapter=new itemAdapter(…)之后,检查itemAdapter!=null,并仅在适配器不为null时设置适配器。
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;
}