Android 集合适配器中的上下文为空
我在这个问题上搜索了很多,但没有找到适合我的答案。我正在尝试将预测数据设置到recyclerview中,并希望通过适配器在列表中设置该数据这里是我的适配器的一段代码Android 集合适配器中的上下文为空,android,nullpointerexception,android-recyclerview,android-adapter,Android,Nullpointerexception,Android Recyclerview,Android Adapter,我在这个问题上搜索了很多,但没有找到适合我的答案。我正在尝试将预测数据设置到recyclerview中,并希望通过适配器在列表中设置该数据这里是我的适配器的一段代码 public Adapter(Context context, List<ForecastCondition> data) { this.context = context; inflater = LayoutInflater.from(context); this.data = data;
public Adapter(Context context, List<ForecastCondition> data) {
this.context = context;
inflater = LayoutInflater.from(context);
this.data = data;
}
我的日志是
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.om.weahterapp, PID: 19218 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.view.LayoutInflater.from(LayoutInflater.java:219)
at data.Adapter.<init>(Adapter.java:38)
at Fragments.ForecastFragment$ForecastTask.onPostExecute(ForecastFragment.java:153)
at Fragments.ForecastFragment$ForecastTask.onPostExecute(ForecastFragment.java:101)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5253)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
使用getApplicationContext或YourActivityName.this而不是getContext进行活动->使用Activity.this 对于片段->使用getActivity而不是使用getContext
private Activity context;
public Adapter(Activity context, List<ForecastCondition> data) {
this.context = context;
inflater = LayoutInflater.from(context);
this.data = data;
}
mAdapter = new Adapter(getActivity(), datalist);
mRVFishPrice.setAdapter(mAdapter);
如果您在其他地方调用构造函数,而不是在oncreate或onviewcreated中调用构造函数,则需要在片段onviewcreated或oncreateview中保存上下文:
Context mContext = getActivity();
和使用mContext相比,若您使用的是片段,这是正确的
如果在调用构造函数之前调用OnAttached,
这似乎是你编辑后的答案,但请发布完整的片段
更新:
在进一步调查之后,似乎片段中的oncreate在本例中不起作用,请参见此图
一旦创建仍然有空的getactivity,getactivity需要位于onattach onviewcreated或oncreateview中
您需要将以下代码添加到片段中:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mContext = getActivity();
}
完成此操作后,不要再使用getactivity或getcontext,请仅使用McContext尝试此操作,而不要使用getcontext来执行getactivity
mAdapter = new Adapter(getActivity(), datalist);
mRVFishPrice.setAdapter(mAdapter);
final LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRVFishPrice.setLayoutManager(layoutManager);
首先设置布局管理器,然后设置适配器
mRVFishPrice.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
mAdapter = new Adapter(getActivity(), datalist);
mRVFishPrice.setAdapter(mAdapter);
代替getContext,添加getActivity并将LinearLayoutManager设置在适配器代码上方。使用getActivity代替getContexti我尝试过很多方法,如getActivity、FragmentActivity等。但是,对于mecan u post您的片段代码来说没有任何效果?这种情况经常发生吗?看我的答案,我想是一样的。请仔细阅读问题。我正在使用fragment所以活动。这不起作用。好的,请参阅更新的答案。不,它对我不起作用相同的错误。您是否更改了public Adapter活动上下文,在这一行列出数据?是的,我已将上下文更改为活动,但这不起作用。请仔细阅读问题。我已经试过了,但它不起作用,所以我必须在你的主抽屉活动类中发布问题,设置公共静态活动activityContext;并设置activityContext=this;在onCreate方法中,当set adapter而不是getContext使用您的类名时。ActivityContext我在onCreate方法中尝试过这个方法,但对我无效。您能发布您的片段吗?这样做会更容易。我已经编辑了问题并添加了完整的片段代码。看一看,请帮我整理。好的,试试这个更新的答案。不,对我不起作用。空指针上下文异常指向适配器
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mContext = getActivity();
}
mAdapter = new Adapter(getActivity(), datalist);
mRVFishPrice.setAdapter(mAdapter);
final LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRVFishPrice.setLayoutManager(layoutManager);
mRVFishPrice.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
mAdapter = new Adapter(getActivity(), datalist);
mRVFishPrice.setAdapter(mAdapter);