从我开始开发此应用程序开始,这是一个我一直有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
我只是希望能够知道什么是错我的应用程序,为什么我得到的情况下空,所以我可以用接下来会发生什么入手我应用程序,也许是结构的东西,它的编程方式,我不知道。任何帮助表示赞赏,如果你需要更多的代码,让我知道。
发表您的videos_activity.xml –
@Rod_Algonquin刚刚发布了它! – Rosie