I've been working on this for hours now. Can't find any reason. I can't post the entire fragment here but the following should make it clear.
@BindView(R.id.acService) AutoCompleteTextView autocompleteService;
@BindView(R.id.acAddress) AutoCompleteTextView autocompleteAddress;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_home, container, false);
unbinder = ButterKnife.bind(this, view);
initialize();
loadSkillsData();
return view;
}
private void initialize()
{
context = getActivity();
util = new Util(context);
requestService = new RequestService();
geoDataClient = Places.getGeoDataClient(context, null);
autocompleteAdapter = new PlaceAutocompleteAdapter(context, geoDataClient, BOUNDS_ONTARIO, null);
autocompleteAddress.setAdapter(autocompleteAdapter);
mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapFragment);
mapFragment.getMapAsync(this);
}
private void loadSkillsData()
{
Realm realm = getRealm();
UserModel user = realm.where(UserModel.class).findFirst();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(RestAPI.ENDPOINT)
.addConverterFactory(MoshiConverterFactory.create())
.build();
RestAPI restApi = retrofit.create(RestAPI.class);
Call<ResponseSkills> loginCall = restApi.getSkills(user.getServerUserId());
loginCall.enqueue(new Callback<ResponseSkills>()
{
@Override
public void onResponse(Call<ResponseSkills> call, final Response<ResponseSkills> response)
{
if (response.isSuccessful())
{
if (response.body().getStatus())
{
skillList = response.body().getSkillList();
ArrayAdapter<SkillModel> skillAdapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, skillList);
autocompleteService.setAdapter(skillAdapter);
}
else
{
switch (response.body().getError())
{
default:
Toasty.error(context, response.body().getError());
break;
}
}
} else
{
Toasty.error(context, getString(R.string.toast_experienced_a_problem)).show();
}
}
@Override
public void onFailure(Call<ResponseSkills> call, Throwable t)
{
Toasty.error(context, getString(R.string.toast_experienced_a_problem)).show();
t.printStackTrace();
}
});
}
Layout:
On the line autocompleteService.setAdapter(skillAdapter);, I get a NPE saying that I'm calling setAdapter on a null object. Debugging tells me autocompleteService is indeed null at this point.
Why is this view null? Butterknife.bind is called way before this is. Why isn't the view initialized?
Here's the exact error:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.AutoCompleteTextView.setAdapter(android.widget.ListAdapter)' on a null object reference
at com.xyz.controllers.HomeFragment$3.onResponse(HomeFragment.java:183)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)