Установка адаптера в Listview в пользовательском представлении, введенном с помощью Butterknife

У меня есть действие с настраиваемым представлением в файле макета Xml:

<com.example.androidmontreal.mvp.infrastructure.views.AndroidRaceResultsView
    android:id="@+id/raceResults"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"/>
    ...

In the onCreate method of this activity I use Butterknife to inject my views:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mvp_main);

    ButterKnife.inject(this);

    ...

}

В моем пользовательском представлении у меня есть список. Перед добавлением Butterknife я устанавливал адаптер для списка в методе onFinishInflate:

    @Override
protected void onFinishInflate() {
    super.onFinishInflate();

    ...

    listView.setAdapter(resultsAdapter);
}

Однако после добавления Butterknife я получаю NPE в строке, где я устанавливаю адаптер, потому что на этом этапе listview имеет значение Null.

Насколько я понимаю, представление создается только при вызове метода Butterknife.inject() в Activity, но это происходит после того, как представление было раздуто. Чего я не могу понять, так это когда я должен установить адаптер для listView.

Изменить: кажется, что дочерние представления в моем пользовательском представлении имеют значение null, даже после того, как utterknife.inject() был вызван для действия. Однако, если я добавлю вызов Butterknife.inject к моему методу onFinishInflate, я получу сообщение об ошибке, говорящее, что java.lang.IllegalStateException: Required view with id '2131034112' for field 'listView' was not found


person DanielO    schedule 30.07.2014    source источник


Ответы (1)


Вы можете сделать это сразу после

ButterKnife.inject(это);

Внутри он заполняет переменную listView, поэтому она становится доступной для вас.

Убедитесь, что у вас есть

@InjectView(R.id.raceResults)
AndroidRaceResultsView listView;

в вашей деятельности.

person avgx    schedule 30.07.2014
comment
Инъекционный вызов находится в моей деятельности, которая не имеет доступа к полю listView в моем пользовательском представлении. Добавление вызова Inject к моему пользовательскому представлению приводит к новой ошибке (см. редактирование в вопросе) - person DanielO; 30.07.2014
comment
хорошо, тогда вам лучше взглянуть на github.com/mmBs/NavigationDrawerSI/blob/master/app/src/main/ - person avgx; 30.07.2014
comment
Вы должны убедиться, что вы внедрили свое собственное представление в активность, как в предыдущей ссылке, посмотрите, как NavigationDrawerView становится доступным в MainActivity. - person avgx; 30.07.2014
comment
Я отмечаю это как ответ, потому что код, который вы связали, решил это для меня. Я изменил свой основной макет xml, чтобы использовать <include ... /> с атрибутом макета, указанным в качестве файла макета моего пользовательского элемента управления, вместо <com.example.androidmontreal.mvp.infrastructure.views.AndroidRaceResultsView ../>. Я не понимаю, почему это работает, но это так. - person DanielO; 31.07.2014