web-dev-qa-db-fra.com

RecyclerView.ViewHolder ne peut pas lier la vue avec ButterKnife

J'utilise ButterKnife pour lier mes vues sur mon ViewHolder. Mon code est ci-dessous:

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

    private List<DataObject> data;

    public MyAdapter(List<DataObject> data) {
        this.data = data;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_layout, parent, false);
        return new ViewHolder(view);
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.row_header_view) View rowHeaderView;
        @BindView(R.id.row_header_view_text) TextView headerTextView;

        @BindView(R.id.row_data_view) View rowDataView;
        @BindView(R.id.row_data_view_text) TextView rowDataTextView;
        @BindView(R.id.row_data_view_detail_text) TextView rowDataDetailTextView;

        public ViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }
}

Pour une raison quelconque, dans mon ViewHolder tous les BindView ne font rien. Ils sont tous nuls. Je peux confirmer avec certitude qu'ils sont dans ma mise en page. Quel est le problème avec mon code ci-dessus? Je l'ai utilisé selon la documentation listée ici:

http://jakewharton.github.io/butterknife/#reset

Y a-t-il autre chose requis? J'utilise la version ButterKnife:

compile 'com.jakewharton:butterknife:8.2.1'

Si j'ajoute la ligne ci-dessous:

rowHeaderView = view.findViewById(R.id.row_header_view);

Il est capable d'obtenir correctement la vue. Mais comment cela a-t-il un sens? ButterKnife n'est pas utilisable où findViewById est utilisable?

26
KVISH

Assurez-vous que si vous avez utilisé la bibliothèque ButterKnife pour utiliser de cette façon

build.gradle fichier du projet

buildscript {
  repositories {
    mavenCentral()
   }
  dependencies {
    classpath 'com.neenbedankt.gradle.plugins:Android-apt:1.8'
  }
}

Ensuite, appliquez le 'Android-apt' plugin dans votre module-level build.gradle et ajoutez les dépendances de Butter Knife:

apply plugin: 'Android-apt'

Android {
  ...
}

dependencies {
  compile 'com.jakewharton:butterknife:8.2.1'
  apt 'com.jakewharton:butterknife-compiler:8.2.1'
}
9
Ironman

Mise à jour d'octobre 2016: Vous n'avez probablement plus besoin d'apt et du plugin Android-apt. La version 2.2 du plug-in Android Gradle a une configuration d'annotationProcessor que vous devriez utiliser à la place.

Dans Android studio 2.2 et ultérieur, ajoutez-les simplement sur votre module build.gradle:

compile 'com.jakewharton:butterknife:8.4.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
20
bastami82