web-dev-qa-db-fra.com

L'utilisation d'un couteau à beurre dans la sous-classe Custom BaseAdapter génère l'erreur "Impossible d'injecter les vues"

J'essaie d'utiliser Butter Knife pour simplifier la création d'une classe BaseAdapter personnalisée. Je suis l'exemple suivant: http://jakewharton.github.io/butterknife/ sous "Une autre utilisation consiste à simplifier le modèle de détenteur de vue à l'intérieur d'un adaptateur de liste." section. Malheureusement, une erreur «Impossible d'injecter des vues» s'affiche chaque fois que ViewHolder est créé pour chaque élément de la liste.

Voici mon code:

public class ButterknifeCustomBaseAdapter extends BaseAdapter{
@Override
public int getCount() {
    return arrayListNames.size();
}

@Override
public Name getItem(int iPosition) {
    return arrayListNames.get(iPosition);
}

@Override
public long getItemId(int iID) {
    return 0;
}

LayoutInflater inflater;
ArrayList<Name> arrayListNames = new ArrayList<Name>();
static Context context;
Activity activity;

public ButterknifeCustomBaseAdapter(Context context, ArrayList<Name> names, Activity activity) {
    arrayListNames = names;
    this.context = context;
    inflater = LayoutInflater.from(this.context);
}



static class ViewHolder implements View.OnClickListener {
    @InjectView(R.id.textViewFullName) TextView textViewFullName;
    @InjectView(R.id.imageButtonDeleteName) TextView imageButtonDeleteName;
    @OnClick(R.id.imageButtonDeleteName)
    public void onClick(View view) {
        ((NameActivity)context).DeleteUser((Name)view.getTag());
    }

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

@Override public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;

    if (convertView != null) {
        viewHolder = (ViewHolder) convertView.getTag();
    } else {
        convertView = inflater.inflate(R.layout.item_name, parent, false);
        viewHolder = new ViewHolder(convertView);
        convertView.setTag(viewHolder);
    }

    viewHolder.textViewFullName.setText(((Name)getItem(position)).GetFullName());
    L.l("ArrayAdapterName", ((Name)getItem(position)).GetID() + " inserted in list | position = " + position);
    viewHolder.imageButtonDeleteName.setTag((Name)getItem(position));
    return convertView;
}

}

L'erreur se produit dans "ButterKnife.Inject (this, view);" ligne. Cela se produit également chaque fois que le détenteur de la vue est créé pour chaque élément que je mets dans la liste. Est-ce que quelqu'un sait comment faire ce travail comme il se doit?

En réponse au commentaire de Jake Wharton Tout d’abord, permettez-moi de vous remercier d’avoir mis au point cet outil. Cela a rendu le développement d'Android bien plus agréable qu'il ne l'était quand j'ai commencé.

Voici le stacktrace complet:

05-04 07:29:01.991    2424-2424/com.murach.databasehomework E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Java.lang.RuntimeException: Unable to inject views for com.murach.databasehomework.ButterknifeCustomBaseAdapter$ViewHolder@52700878
            at butterknife.ButterKnife.inject(ButterKnife.Java:221)
            at butterknife.ButterKnife.inject(ButterKnife.Java:184)
            at com.murach.databasehomework.ButterknifeCustomBaseAdapter$ViewHolder.<init>(ButterknifeCustomBaseAdapter.Java:59)
            at com.murach.databasehomework.ButterknifeCustomBaseAdapter.getView(ButterknifeCustomBaseAdapter.Java:70)
            at Android.widget.AbsListView.obtainView(AbsListView.Java:2177)
            at Android.widget.ListView.makeAndAddView(ListView.Java:1840)
            at Android.widget.ListView.fillDown(ListView.Java:675)
            at Android.widget.ListView.fillFromTop(ListView.Java:736)
            at Android.widget.ListView.layoutChildren(ListView.Java:1655)
            at Android.widget.AbsListView.onLayout(AbsListView.Java:2012)
            at Android.view.View.layout(View.Java:14289)
            at Android.view.ViewGroup.layout(ViewGroup.Java:4562)
            at Android.widget.RelativeLayout.onLayout(RelativeLayout.Java:1076)
            at Android.view.View.layout(View.Java:14289)
            at Android.view.ViewGroup.layout(ViewGroup.Java:4562)
            at Android.widget.FrameLayout.onLayout(FrameLayout.Java:448)
            at Android.view.View.layout(View.Java:14289)
            at Android.view.ViewGroup.layout(ViewGroup.Java:4562)
            at com.Android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.Java:349)
            at Android.view.View.layout(View.Java:14289)
            at Android.view.ViewGroup.layout(ViewGroup.Java:4562)
            at Android.widget.FrameLayout.onLayout(FrameLayout.Java:448)
            at Android.view.View.layout(View.Java:14289)
            at Android.view.ViewGroup.layout(ViewGroup.Java:4562)
            at Android.view.ViewRootImpl.performLayout(ViewRootImpl.Java:1976)
            at Android.view.ViewRootImpl.performTraversals(ViewRootImpl.Java:1730)
            at Android.view.ViewRootImpl.doTraversal(ViewRootImpl.Java:1004)
            at Android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.Java:5481)
            at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:749)
            at Android.view.Choreographer.doCallbacks(Choreographer.Java:562)
            at Android.view.Choreographer.doFrame(Choreographer.Java:532)
            at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:735)
            at Android.os.Handler.handleCallback(Handler.Java:730)
            at Android.os.Handler.dispatchMessage(Handler.Java:92)
            at Android.os.Looper.loop(Looper.Java:137)
            at Android.app.ActivityThread.main(ActivityThread.Java:5103)
            at Java.lang.reflect.Method.invokeNative(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:525)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:737)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:553)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: Java.lang.reflect.InvocationTargetException
            at Java.lang.reflect.Method.invokeNative(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:525)
            at butterknife.ButterKnife.inject(ButterKnife.Java:216)
            at butterknife.ButterKnife.inject(ButterKnife.Java:184)
            at com.murach.databasehomework.ButterknifeCustomBaseAdapter$ViewHolder.<init>(ButterknifeCustomBaseAdapter.Java:59)
            at com.murach.databasehomework.ButterknifeCustomBaseAdapter.getView(ButterknifeCustomBaseAdapter.Java:70)
            at Android.widget.AbsListView.obtainView(AbsListView.Java:2177)
            at Android.widget.ListView.makeAndAddView(ListView.Java:1840)
            at Android.widget.ListView.fillDown(ListView.Java:675)
            at Android.widget.ListView.fillFromTop(ListView.Java:736)
            at Android.widget.ListView.layoutChildren(ListView.Java:1655)
            at Android.widget.AbsListView.onLayout(AbsListView.Java:2012)
            at Android.view.View.layout(View.Java:14289)
            at Android.view.ViewGroup.layout(ViewGroup.Java:4562)
            at Android.widget.RelativeLayout.onLayout(RelativeLayout.Java:1076)
            at Android.view.View.layout(View.Java:14289)
            at Android.view.ViewGroup.layout(ViewGroup.Java:4562)
            at Android.widget.FrameLayout.onLayout(FrameLayout.Java:448)
            at Android.view.View.layout(View.Java:14289)
            at Android.view.ViewGroup.layout(ViewGroup.Java:4562)
            at com.Android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.Java:349)
            at Android.view.View.layout(View.Java:14289)
            at Android.view.ViewGroup.layout(ViewGroup.Java:4562)
            at Android.widget.FrameLayout.onLayout(FrameLayout.Java:448)
            at Android.view.View.layout(View.Java:14289)
            at Android.view.ViewGroup.layout(ViewGroup.Java:4562)
            at Android.view.ViewRootImpl.performLayout(ViewRootImpl.Java:1976)
            at Android.view.ViewRootImpl.performTraversals(ViewRootImpl.Java:1730)
            at Android.view.ViewRootImpl.doTraversal(ViewRootImpl.Java:1004)
            at Android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.Java:5481)
            at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:749)
            at Android.view.Choreographer.doCallbacks(Choreographer.Java:562)
            at Android.view.Choreographer.doFrame(Choreographer.Java:532)
            at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:735)
            at Android.os.Handler.handleCallback(Handler.Java:730)
            at Android.os.Handler.dispatchMessage(Handler.Java:92)
            at Android.os.Looper.loop(Looper.Java:137)
            at Android.app.ActivityThread.main(ActivityThread.Java:5103)
            at Java.lang.reflect.Method.invokeNative(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:525)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:737)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:553)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: Java.lang.ClassCastException: Android.widget.ImageButton cannot be cast to Android.widget.TextView
            at com.murach.databasehomework.ButterknifeCustomBaseAdapter$ViewHolder$$ViewInjector.inject(ButterknifeCustomBaseAdapter$ViewHolder$$ViewInjector.Java:13)
            at Java.lang.reflect.Method.invokeNative(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:525)
            at butterknife.ButterKnife.inject(ButterKnife.Java:216)
            at butterknife.ButterKnife.inject(ButterKnife.Java:184)
            at com.murach.databasehomework.ButterknifeCustomBaseAdapter$ViewHolder.<init>(ButterknifeCustomBaseAdapter.Java:59)
            at com.murach.databasehomework.ButterknifeCustomBaseAdapter.getView(ButterknifeCustomBaseAdapter.Java:70)
            at Android.widget.AbsListView.obtainView(AbsListView.Java:2177)
            at Android.widget.ListView.makeAndAddView(ListView.Java:1840)
            at Android.widget.ListView.fillDown(ListView.Java:675)
            at Android.widget.ListView.fillFromTop(ListView.Java:736)
            at Android.widget.ListView.layoutChildren(ListView.Java:1655)
            at Android.widget.AbsListView.onLayout(AbsListView.Java:2012)
            at Android.view.View.layout(View.Java:14289)
            at Android.view.ViewGroup.layout(ViewGroup.Java:4562)
            at Android.widget.RelativeLayout.onLayout(RelativeLayout.Java:1076)
            at Android.view.View.layout(View.Java:14289)
            at Android.view.ViewGroup.layout(ViewGroup.Java:4562)
            at Android.widget.FrameLayout.onLayout(FrameLayout.Java:448)
            at Android.view.View.layout(View.Java:14289)
            at Android.view.ViewGroup.layout(ViewGroup.Java:4562)
            at com.Android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.Java:349)
            at Android.view.View.layout(View.Java:14289)
            at Android.view.ViewGroup.layout(ViewGroup.Java:4562)
            at Android.widget.FrameLayout.onLayout(FrameLayout.Java:448)
            at Android.view.View.layout(View.Java:14289)
            at Android.view.ViewGroup.layout(ViewGroup.Java:4562)
            at Android.view.ViewRootImpl.performLayout(ViewRootImpl.Java:1976)
            at Android.view.ViewRootImpl.performTraversals(ViewRootImpl.Java:1730)
            at Android.view.ViewRootImpl.doTraversal(ViewRootImpl.Java:1004)
            at Android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.Java:5481)
            at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:749)
            at Android.view.Choreographer.doCallbacks(Choreographer.Java:562)
            at Android.view.Choreographer.doFrame(Choreographer.Java:532)
            at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:735)
            at Android.os.Handler.handleCallback(Handler.Java:730)
            at Android.os.Handler.dispatchMessage(Handler.Java:92)
            at Android.os.Looper.loop(Looper.Java:137)
            at Android.app.ActivityThread.main(ActivityThread.Java:5103)
            at Java.lang.reflect.Method.invokeNative(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:525)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:737)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:553)
            at dalvik.system.NativeStart.main(Native Method)
22
reggie3

Vérifiez si votre @InjectViews a le type correct. J'ai utilisé ImageView au lieu de LinearLayout. Cela pourrait être votre problème aussi.

Mettre à jour:

Assurez-vous de ne pas utiliser la @OnItemClick(R.id.non_list_view) de ButterKnife avec une variable ListView. Je l'utilisais pour un Android.support.v7.widget.RecyclerView qui causait l'exception suivante: 

Java.lang.RuntimeException: Unable to inject views for MyFragment{... id=.... Android:switcher:...}
47
ViliusK

Vérifiez également si vous gonflez le bon fichier R.layout.. Sinon, les vues nécessaires ne sont pas trouvées et cette erreur se produit.

6
ViliusK

J'ai eu un problème similaire avec ButterKnife, mais la raison était que je gonflais mon fragment avec une mauvaise mise en page.

( Je sais que la question a déjà été posée, mais j'ai décidé d'afficher ma solution au cas où quelqu'un aurait le même problème )

3
Gonçalo Araújo

Pour moi, il s'est avéré que la variable ViewBinder n'était pas correctement actualisée. Une construction de projet propre a résolu ce problème.

1
Langusten Gustel

Ceux qui recherchent toujours cela se produisent si vous essayez de lier un type de vue incorrect à partir de XML dans Java.

Par exemple

Vous avez TextView avec résultat id

 <TextView
        Android:id="@+id/result"
        Android:layout_width="match_parent"
        Android:layout_height="0dp"
        Android:gravity="center"
        Android:layout_centerHorizontal="true"
        Android:layout_margin="3dp"
        Android:layout_weight="2"
        Android:background="#fff"
        Android:text="Calculator"
        Android:textSize="25sp" />

Et vous essayez de le lier avec Button dans un fichier Java

@BindView (R.id.result) Résultat du bouton;

Il est parti crash de votre application.

Butterknife lèvera une exception pour diffusion de vues illégale sous la forme Impossible d'injecter une erreur de vue

0
Hitesh Sahu