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)
Vérifiez si votre @InjectView
s 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:...}
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.
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 )
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.
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