Android возвращает нулевой ListView, когда findViewById - PullRequest
1 голос
/ 07 июля 2019

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

<?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.

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

Ответы [ 2 ]

2 голосов
/ 07 июля 2019

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

    ...

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

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

    ...

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

1 голос
/ 07 июля 2019

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...