Android - 创建适配器时出现 NullPointerException
Android - NullPointerException from creating an adapter
我正在为列表视图创建数组适配器,
一切正常,我有 2 个片段,操作栏顶部的 2 个按钮在这 2 个片段之间变化。
我的问题是,如果我在这些碎片之间移动得太快,我会崩溃,当我打开 fragOne,切换到 fragTwo,然后快速移动回 fragOne 时。fragOne 从 getActivity 上下文中抛出 NPE..
那是崩溃的行:
adapter = new MainFragmentDocumentAdapter(getActivity(), docsList, DocumentsFragment.this, page);
日志报告:
E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.bbb.app, PID: 17438
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:104)
at com.bbb.app.UI.adapters.MainFragmentDocumentAdapter.<init>(MainFragmentDocumentAdapter.java:51)
知道如何解决这个问题吗?
所以基本上经过大量检查后我发现问题是我在另一个片段中返回到那个片段因为我有一个侦听器指向那里并试图打开那个方法。
基本上我只是把它包裹在一个
if (getActivity() != null) {
// Code goes here.
}
问题解决了。
非常感谢大家的帮助!
使用 try catch 块,
它对我有用
你可以这样做。
里面activity
public static UsageRecommendationTabActivity getInstance() {
return activityInstance;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityInstance=this;
}
片段内部
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
if (activity instanceof UsageRecommendationTabActivity)
mParentActivity = (UsageRecommendationTabActivity) activity;
if (mParentActivity == null)
mParentActivity = UsageRecommendationTabActivity.getInstance();
}
然后调用您的适配器
adapter = new MainFragmentDocumentAdapter(mParentActivity, docsList, DocumentsFragment.this, page);
如果您在片段上,请检查片段是否已添加。
{
...
if (!this.isAdded()) { //this = current fragment
return;
}
LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
...
}
添加对 getContext()!=null
的检查
区块前
mAdapter = new SimpleHomeItemAdapter(getActivity(), mList);
listview.setAdapter(mAdapter);
例如:
if (getActivity()!=null){
mAdapter = new SimpleHomeItemAdapter(getActivity(), mList);
listview.setAdapter(mAdapter);
}
我正在为列表视图创建数组适配器, 一切正常,我有 2 个片段,操作栏顶部的 2 个按钮在这 2 个片段之间变化。 我的问题是,如果我在这些碎片之间移动得太快,我会崩溃,当我打开 fragOne,切换到 fragTwo,然后快速移动回 fragOne 时。fragOne 从 getActivity 上下文中抛出 NPE..
那是崩溃的行:
adapter = new MainFragmentDocumentAdapter(getActivity(), docsList, DocumentsFragment.this, page);
日志报告:
E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.bbb.app, PID: 17438
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:104)
at com.bbb.app.UI.adapters.MainFragmentDocumentAdapter.<init>(MainFragmentDocumentAdapter.java:51)
知道如何解决这个问题吗?
所以基本上经过大量检查后我发现问题是我在另一个片段中返回到那个片段因为我有一个侦听器指向那里并试图打开那个方法。
基本上我只是把它包裹在一个
if (getActivity() != null) {
// Code goes here.
}
问题解决了。
非常感谢大家的帮助!
使用 try catch 块, 它对我有用
你可以这样做。
里面activity
public static UsageRecommendationTabActivity getInstance() {
return activityInstance;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityInstance=this;
}
片段内部
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
if (activity instanceof UsageRecommendationTabActivity)
mParentActivity = (UsageRecommendationTabActivity) activity;
if (mParentActivity == null)
mParentActivity = UsageRecommendationTabActivity.getInstance();
}
然后调用您的适配器
adapter = new MainFragmentDocumentAdapter(mParentActivity, docsList, DocumentsFragment.this, page);
如果您在片段上,请检查片段是否已添加。
{
...
if (!this.isAdded()) { //this = current fragment
return;
}
LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
...
}
添加对 getContext()!=null
的检查区块前
mAdapter = new SimpleHomeItemAdapter(getActivity(), mList);
listview.setAdapter(mAdapter);
例如:
if (getActivity()!=null){
mAdapter = new SimpleHomeItemAdapter(getActivity(), mList);
listview.setAdapter(mAdapter);
}