Не знаю, как ввести адаптер для RecyclerView - PullRequest
0 голосов
/ 08 мая 2018

Я сделал простой проект для изучения Dagger. Приложение извлекает список свойств (аренда жилья) из Интернета и отображает их в списке RecyclerView. Я внедрил все зависимости с Dagger 2, кроме адаптера для списка. Адаптер довольно стандартный, он берет список свойств и заполняет представления:

public class PropertyListAdapter extends RecyclerView.Adapter<PropertyListAdapter.ViewHolder> {

    private List<Property> mPropertyList;

    @Inject
    public PropertyListAdapter(List<Property> propertyList) {
        mPropertyList = propertyList;
    }

    // onCreateViewHolder()
    // onBindViewHolder()
    // getItemCount()
    // class ViewHolder{}

}

Приложение состоит из одного действия, которое содержит фрагмент, содержащий список recyclerview. Во фрагменте onActivityCreated() у меня есть:

mPropertyViewModel.getPropertyList().observe(this, properties -> setPropertyAdapter(properties));

и setPropertyAdapter():

private void setPropertyAdapter(List<Property> properties) {
    rvPropertyList.setAdapter(new PropertyListAdapter(properties));
}

Итак, чтобы ввести PropertyListAdapter Я создал модуль:

@Module
    public class AdapterModule {
    @Provides
    @Singleton
    PropertyListAdapter providePropertyListAdapter(List<Property> propertyList) {
        return new PropertyListAdapter(propertyList);
}

}

но потом я понял, что мне нужно вводить List<Property>, и я не знаю, как этого добиться, и я застрял. Как ввести адаптер в этом примере?

P.S. Я использую MVVM с компонентами архитектуры.

Logcat: error: [dagger.android.AndroidInjector.inject(T)] java.util.List<com.aandritchi.android.propertyrentals.data.domain.Property> cannot be provided without an @Provides-annotated method. java.util.List<com.aandritchi.android.propertyrentals.data.domain.Property> is injected at com.aandritchi.android.propertyrentals.di.module.data.AdapterModule.providePropertyListAdapter(propertyList) com.aandritchi.android.propertyrentals.ui.search_result.PropertyListAdapter is injected at com.aandritchi.android.propertyrentals.ui.search_result.PropertySearchResultFragment.mPropertyListAdapter com.aandritchi.android.propertyrentals.ui.search_result.PropertySearchResultFragment is injected at com.aandritchi.android.propertyrentals.ui.home.HomeActivity.mPropertySearchResultFragment com.aandritchi.android.propertyrentals.ui.home.HomeActivity is injected at dagger.android.AndroidInjector.inject(arg0)

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вы должны спросить себя: мне действительно нужно вводить адаптер?

Две причины, почему вы хотели бы сделать это:

1) Адаптер имеет зависимости, которые вы хотите внедрить. Это не ваш случай, потому что нет никаких других зависимостей, кроме списка свойств.

2) Вы хотите снять ответственность за создание экземпляра Адаптера с вашей Деятельности / Фрагмента.

Правильное решение для обеих проблем состоит в том, чтобы внедрить фабрику, в которой уже есть все внедряемые зависимости и которая предоставляет метод для создания экземпляра.

0 голосов
/ 08 мая 2018

После комментария David Medenjak я понял, что не правильно использую инъекцию в конструктор, и подход был неверным. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}}} *} * * *} * * *}} *}}}}}} Итак, решение:

public class PropertyListAdapter extends RecyclerView.Adapter<PropertyListAdapter.ViewHolder> {

    private List<Property> mPropertyList;

    public void setPropertyList(List<Property> propertyList) {
        mPropertyList = propertyList;
    }

    @Inject
    public PropertyListAdapter() {
    }

    // onCreateViewHolder()
    // onBindViewHolder()
    // getItemCount()
    // class ViewHolder{}
}

и во фрагменте мне нужно было установить список свойств:

private void setPropertyAdapter(List<Property> properties) {
    mPropertyListAdapter.setPropertyList(properties); // added this line
    rvPropertyList.setAdapter(mPropertyListAdapter);
}
...