Я пытался использовать код, приведенный в ответе на вопрос это, хотя я решил не использовать отдельный класс для ListAdapter. Когда я пытаюсь начать свою деятельность (InfosActivity), приложение вылетает, вот журнал:
05-02 11:50:22.195 7521-7521/com.example.uia59227.User_and_Car_Data E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.uia59227.User_and_Car_Data, PID: 7521
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.uia59227.User_and_Car_Data/com.example.uia59227.User_and_Car_Data.InfosActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2849)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3045)
at android.app.ActivityThread.-wrap14(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1642)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:106)
at com.example.uia59227.User_and_Car_Data.InfosActivity.<init>(InfosActivity.java:223)
at java.lang.Class.newInstance(Native Method)
at android.app.Instrumentation.newActivity(Instrumentation.java:1086)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2839)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3045)
at android.app.ActivityThread.-wrap14(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1642)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
Я прочитал несколько тем об исключении NullPointer, но все еще не могу найти решение.
Вот мой ListAdapter:
String[] items = {"airplanes", "animals", "cars", "colors", "flowers", "letters", "monsters", "numbers", "shapes", "smileys", "sports", "stars" };
ListAdapter adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.list_row, items) {
ViewHolder holder;
Drawable icon;
class ViewHolder {
ImageView icon;
TextView title;
}
public View getView(int position, View convertView, ViewGroup parent) {
final LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_row, null);
holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
holder.title = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(holder);
} else {
// view already defined, retrieve view holder
holder = (ViewHolder) convertView.getTag();
}
Drawable drawable = ContextCompat.getDrawable(context,R.drawable.ic_person); //this is an image from the drawables folder
holder.title.setText(items[position]);
holder.icon.setImageDrawable(drawable);
return convertView;
}
};
И как я его использую:
quickReviewButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder
.setTitle("Full report")
.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(InfosActivity.this, "You selected: " + items[item], Toast.LENGTH_LONG).show();
dialog.dismiss();
}
});
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
// show it
alertDialog.show();
}
});
Не могли бы вы мне помочь ?
Готово, но я не уверен, где возникает исключение
Строка, вызывающая ошибку, - это строка 223 в вашем InfoActivity.
Тогда это объявление моего адаптера ListAdapter, но я не знаю, что я могу для него сделать.
это в одном мероприятии? вам не нужно использовать getapplicationcontext, вместо этого используйте это для контекста
ListAdapter adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.list_row, items) {...}
этот фрагмент кода вызывает ошибку
Gastón Saillén действительно работает, но не решает проблему
Проблема в том, что вы создаете экземпляр своего ListAdapter в объявлении. Таким образом, создание экземпляра выполняется во время создания экземпляра класса InfoActivity (то есть до того, как создание экземпляра будет завершено). Если InfoActivity не завершил создание экземпляра, this
- это null
. Итак, когда вы делаете getApplicationContext()
, вы делаете this.getapplicationContext()
, но this
нулевой.
Вы должны создать экземпляр своего ListAdapter после создания экземпляра Activity. Таким образом, вы можете, например, создать экземпляр своего Listadapter в методе onStart ().
Более того, как объясняется в этом комментарий, если вам нужен контекст вашей активности, используйте this
вместо getApplicationContext()
@ downvoter, не могли бы вы оставить отзыв? Так что я могу улучшить свой ответ
Я возвращаюсь к вам, поскольку у меня все еще есть исключение NullPointerException, указывающее на строку holder.icon.setImageDrawable(drawable);
. В определении getview у меня есть предупреждение на parent
, в котором написано not annotated parameter overrides @NonNull parameter
, и я не знаю, является ли это причиной моей ошибки.
Это означает, что либо holder
, либо icon
равно нулю. holder
имеет значение null, если вы пройдете через else и convertView.getTag () вернет null. icon
имеет значение null, если вы проходите if, а findViewById()
не может найти представление, имеющее R.id.icon
в качестве идентификатора, или вы проходите через else, и объект, возвращаемый convertView.getTag()
, имеет значок поля, который имеет значение null
Хорошо, мне было непросто понять это, но я сделал это, заменил convertView.findViewById(R.id.icon);
, которого не существует (я не понимаю, почему у меня не было ошибок), на findViewById(R.id.Car)
, который действительно существует, и он работает. Спасибо!
Опубликуйте полную трассировку стека, пожалуйста, и покажите нам, в какой строке попадает NullPointerException