Android возвращает null ListView, когда findViewById

Я создал собственный диалог (с представлением списка):

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:orientation = "vertical">

<ImageView
    android:layout_width = "332dp"
    android:layout_height = "64dp"
    android:background = "@android:color/black"
    android:contentDescription = "@string/placeholder"
    android:scaleType = "center" />
<!--android:src = "@drawable/app_dialog_header" -->

<ListView
    android:id = "@+id/pokemon_list_view"
    android:layout_width = "match_parent"
    android:layout_height = "343dp"
    android:divider = "@color/colorPrimaryDark" />

</LinearLayout>

Однако, когда я пытаюсь вызвать его из MainActivity (используя findViewById(R.id.pokemon_list_view); ) я получаю ноль:

     Caused by: java.lang.NullPointerException: Attempt to invoke virtual 
method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' 
on a null object reference

.

     final ArrayList<Pokemon> pokemons = databaseAccess.getAllPokemonWithTypes(type1, type2);

    // load the customized_dialog.xml layout and inflate to view
    LayoutInflater layoutinflater = getLayoutInflater();

    pokemonFoundListView = (ListView)  findViewById(R.id.pokemon_list_view);
    pokemonAdapter = new PokemonAdapter(this, pokemons);
    pokemonFoundListView.setAdapter(pokemonAdapter);

    View customizedUserView = (View) layoutinflater.inflate(R.layout.customized_dialog, null);

    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);

    alertDialogBuilder.setView(customizedUserView);

    AlertDialog alertDialog = alertDialogBuilder.create();

    alertDialogBuilder.setAdapter(pokemonAdapter, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int item) {

        }
    });

    alertDialog.show();

НО, если я помещу этот ListView в свой content_main.xml (представление MainActivty), Android найдет его. Я предполагаю, что проблема здесь в том, что я не могу ссылаться на другой элемент из другого представления XML, который не является моим content_main.xml.

Как я могу это исправить ?

1
0
43
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

попробуйте вызвать findViewById в вашем пользовательском представлении

    ...

    View customizedUserView = (View) layoutinflater.inflate(R.layout.customized_dialog, null);

    pokemonFoundListView = (ListView) customizedUserView.findViewById(R.id.pokemon_list_view);

    ...

Надеюсь, поможет

Ваш диалог добавляется в иерархию представлений ленивым способом.

Поэтому, если вы попытаетесь найти список (внутри диалогового окна) из корневого представления вашей активности, оно не будет найдено. (подумайте о ViewStub).

Но представление находится внутри вашего диалога, поэтому

View customizedUserView = (View) layoutinflater.inflate(R.layout.customized_dialog, null);
pokemonFoundListView = (ListView)  customizedUserView.findViewById(R.id.pokemon_list_view);

Правильно найдет вид.

Другие вопросы по теме